6

次のコードを検討してください。

<!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

4

2 に答える 2

8

パターンpat2もpat3も最初のグループrnbqkb-rをキャプチャしないのはなぜですか?

pat2各8文字のシーケンスの最後に、正規表現で許可されてpat3いない空白があるためです。

パターンpat1のように明示的に繰り返すことなく、すべてのグループをキャプチャしたいと思います。

できません。

正規表現にグループが1つしかない場合、(JavaScriptでは)2つのグループをキャプチャすることはできません。

グループは括弧で囲まれて定義されます。一致結果には、正規表現に含まれる括弧のペアと同じ数のグループが含まれます((?:...)一致グループにカウントされないような変更された括弧を除く)。試合結果に2つの別々のグループ試合が必要ですか?正規表現で2つの別々のグループを定義します。

グループが複数回一致する可能性がある場合、グループの値は最後に一致したものになります。そのグループの以前のすべての一致の発生は、最後の一致によって上書きされます。

試す

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()動的な値から生成する式にのみ使用してください。
  • <特別ではあり>ません、あなたはそれらを逃れる必要はありません。
于 2012-08-14T20:02:17.463 に答える
2

もう一度数えます(8対9)。2つの部分の間にスペースがありませんpat2pat3

更新:さらに、を使用して達成しようとしていることは不可能ですmatchPHPのpreg_match_all()と同様に、JavaScriptで複数のオカレンスを正規表現と照合するにはどうすればよいですか?を参照してください。を使用しますexec

于 2012-08-14T19:51:31.213 に答える