2012-08-14 91 views
1

捕获多组考虑下面的代码:正则表达式:使用量词

<!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那样明确地重复它们。

回答

5

为什么模式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()
  • <>并不特别,你不需要逃避它们。
2

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

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

+0

空白包含在图案中。无论如何,我试过'^ \\ <12\\>([rnbqkp RNBQKP - ] {9}){2}'和'^ \\ <12\\>([rnbqkp RNBQKP - ] {9}){2}?'这两者都导致<12> rnbqkb-r Rnbq-b-r,Rnbq-b-r。同样,第一组没有被捕获。 – chessweb 2012-08-14 19:58:01

+0

请参阅http://refiddle.com/2xh替换8/9并查看区别。但这不是你问题的根源。 – Prinzhorn 2012-08-14 20:00:18