【问题标题】:Why is my regex pattern capturing only final pair? It should capture all pairs in each match为什么我的正则表达式模式只捕获最后一对?它应该捕获每场比赛中的所有对
【发布时间】:2014-06-22 01:26:59
【问题描述】:

我的问题是:为什么我的正则表达式模式只捕获最后一对?它应该捕获每场比赛中的所有对。

我这里有这个字符串:

[Profile0]
Name=Main
IsRelative=1
Path=Profiles/vr10qb8s.default
Default=1

[Profile1]
Name=Clean
IsRelative=1
Path=Profiles/k46wtieb.clean

我在上面运行这个脚本:

        var patt = /\[(.*?)\](?:\s+?(.+?)=(.+))+/g;
        var blocks = [];

        var match;
        while (match = patt.exec(readStr)) {
            alert(match)
        }

此脚本的输出是两个警报:

警报 1:

Array [ "[Profile0]
Name=Main
IsRelative=1
Path=Profiles/vr10qb8s.default
Default=1", "Profile0", "Default", "1" ]

警报 2:

Array [ "[Profile1]
Name=Clean
IsRelative=1
Path=Profiles/k46wtieb.clean", "Profile1", "Path", "Profiles/k46wtieb.clean" ]

我的问题是,为什么它只捕获每组中的最后一对。

我希望看到的是这样的:

alert 1 应该是(注意 "Name", "Main", "IsRelative", "1", "Path", "Profiles/vr10qb8s.default",

Array [ "[Profile0]
Name=Main
IsRelative=1
Path=Profiles/vr10qb8s.default
Default=1", "Profile0", "Name", "Main", "IsRelative", "1", "Path", "Profiles/vr10qb8s.default", "Default", "1" ]

警报 2 应该是(注意 "Name", "Clean", "IsRelative", "1",

Array [ "[Profile1]
Name=Clean
IsRelative=1
Path=Profiles/k46wtieb.clean", "Profile1", "Name", "Clean", "IsRelative", "1", "Path", "Profiles/k46wtieb.clean" ]

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    遗憾的是,带有量词的组不会为该组生成捕获数组。它也不会自动生成数量不断增加的捕获组。

    • 对于给定的组号,组的内容会被最后一次捕获覆盖。这就是为什么您只看到最后一对。
    • 我知道的唯一例外是 .NET,您可以在其中获得带有连续捕获的 CaptureCollection。
    • 为了消除歧义,Perl 和 PCRE 等语言中的分支重置功能允许您在交替的多个方面使用相同的组 - 同样,您不会获得多个捕获。

    【讨论】:

    • 一个非常深入的回复非常感谢你,这让我发疯了,我无法弄清楚我做错了什么。覆盖东西很有意义。你对如何解决这个问题有什么建议吗?我在想这样的事情:var patt = /\[(.*?)\](?:\s+?(.+?)=(.+))?(?:\s+?(.+?)=(.+))?/g; 在这里我只是在模式中重复 (?:\s+?(.+?)=(.+))? 两次,但对于生产我只会重复 20 次,你怎么看?
    • 我的第一个想法是它是否必须在浏览器中执行。如果没有,我可能会在服务器上运行它,在 PHP 中,您可以使用 \G 在一个正则表达式中处理它。在 JS 中,我会分别对每个警报运行一个正则表达式。然后正则表达式可以只匹配一个键=值对,然后您遍历匹配项。这是迄今为止最简单的。
    • 感谢您的推荐。是的,它已经在浏览器中运行了 :( 添加重复的 (?:\s+?(.+?)=(.+))? 会对 JS 性能不利吗?或者可以吗?
    • 不,没关系。完全由您决定。
    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多