【问题标题】:Regular Expressions: Capture multiple groups using quantifier正则表达式:使用量词捕获多个组
【发布时间】:2012-08-11 04:18:04
【问题描述】:

考虑以下代码:

<!DOCTYPE html>
<html>
<body>
<script type="text/javascript">

var str = '<12> rnbqkb-r Rnbq-b-r ';

var pat1 = new RegExp('^\\<12\\> ([rnbqkpRNBQKP-]{8}) ([rnbqkpRNBQKP-]{8})');
var pat2 = new RegExp('^\\<12\\> ([rnbqkp RNBQKP-]{8}){2}');
var pat3 = new RegExp('^\\<12\\> ([rnbqkp RNBQKP-]{8}){2}?');

document.write(str.match(pat1));
document.write('<br />');
document.write(str.match(pat2));
document.write('<br />');
document.write(str.match(pat3));

</script>
</body>
</html>

产生

<12> rnbqkb-r Rnbq-b-r,rnbqkb-r,Rnbq-b-r
<12> rnbqkb-r Rnbq-b-, Rnbq-b-
<12> rnbqkb-r Rnbq-b-, Rnbq-b-

作为输出。

为什么模式pat2pat3 都没有捕获第一组rnbqkb-r?我想捕获所有组,而不必像pat1 那样明确地重复它们。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    再次数数(8 对 9)。 pat2pat3 缺少两个部分之间的空格。

    更新:此外,我不认为您通过使用 match 来实现的目标是可能的。请参阅How can I match multiple occurrences with a regex in JavaScript similar to PHP's preg_match_all()? 并使用exec

    【讨论】:

    • 空白包含在模式中。无论如何,我尝试了 '^\\ ([rnbqkp RNBQKP-]{9}){2}' 和 '^\\ ([rnbqkp RNBQKP-]{9}){2} ?这两者都导致 rnbqkb-r Rnbq-b-r ,Rnbq-b-r 。同样,第一组没有被捕获。
    • refiddle.com/2xh 替换8/9,看看有什么不同。但这不是问题的根源。
    【解决方案2】:

    为什么模式 pat2 和 pat3 都没有捕获第一组 rnbqkb-r?

    因为您的正则表达式 pat2pat3 不允许在每个 8 字符序列的末尾有空格。

    我想捕获所有组,而不必像模式 pat1 中那样明确地重复它们。

    你不能。

    当您的正则表达式仅包含一个组时,不可能(在 JavaScript 中)捕获两个组。

    组通过括号定义。您的匹配结果将包含与您的正则表达式中的括号对一样多的组(除了修改后的括号,如 (?:...) 不计入匹配组)。想要在您的比赛结果中进行两场单独的小组赛?在您的正则表达式中定义两个单独的组。

    如果一个组可以匹配多次,则该组的值将是它匹配的任何值最后。该组之前的所有匹配项都将被其最后一个匹配项覆盖。

    试试

    var pat1 = /^<12> ((?:[rnbqkp-]{8} ?)*)/i,
        match = str.match(pat1);
    
    if (match) {
      match[1].split(/\s+/);  // ["rnbqkb-r", "Rnbq-b-r", ""]
    }
    

    注意事项:

    • 如果您不想要最后一个空数组值,请预先修剪 str
    • 一般来说,更喜欢正则表达式文字表示法 (/expression/)。仅将 new RegExp() 用于从动态值生成的表达式。
    • &lt;&gt; 并不特殊,不需要转义。

    【讨论】:

    • 到 2019 年仍然如此吗?我刚刚遇到这个问题,找不到比您的答案更新的答案。
    • 直到 2020 年仍然如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    相关资源
    最近更新 更多