2012-08-14 90 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