正则表达式:使用量词捕获多个组

che*_*web 6 javascript regex

请考虑以下代码:

<!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>
Run Code Online (Sandbox Code Playgroud)

哪个产生

<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-
Run Code Online (Sandbox Code Playgroud)

作为输出.

为什么既没有模式pat2也没有pat3捕获第一组rnbqkb-r?我想捕获所有组,而不必像模式中那样明确地重复它们pat1.

Tom*_*lak 7

为什么模式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", ""]
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  • str如果您不想要最后一个空数组值,请事先修剪.
  • 通常,更喜欢正则表达式文字符号(/expression/).使用new RegExp()只为你从动态值产生表达式.
  • <>不是特殊的,你不需要逃避他们.