请考虑以下代码:
<!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.
为什么模式pat2和pat3都没有捕获第一组rnbqkb-r?
因为你的正则表达式pat2和pat3不允许的每个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()只为你从动态值产生表达式.<而>不是特殊的,你不需要逃避他们.