1. ホーム
  2. javascript

[解決済み] JavaScript Regexpで任意の数のグループを捕捉する方法は?

2023-03-12 01:09:20

質問

私は、このJavaScriptの行を期待しています。

"foo bar baz".match(/^(\s*\w+)+$/)

のようなものを返すようにします。

["foo bar baz", "foo", " bar", " baz"]

の代わりに、最後に捕捉されたマッチだけを返します。

["foo bar baz", " baz"]

キャプチャしたマッチをすべて取得する方法はありますか?

どのように解決するのですか?

キャプチャグループを繰り返すと、ほとんどのフレーバーで、最後のキャプチャのみが保持され、以前のキャプチャは上書きされます。.NETなどのいくつかのフレーバーでは、すべての中間キャプチャを取得することができますが、これはJavascriptの場合ではありません。

つまり、Javascriptでは、パターンが N のキャプチャグループがある場合、キャプチャできるのは正確に N の文字列しか捕捉できません。

ですから、一般的には、必要なものによって

  • オプションであれば、代わりに区切り文字で分割する
  • マッチングする代わりに /(pattern)+/ をマッチさせるのではなく、多分 /pattern/g で、おそらく exec ループ
    • この2つは全く同じものではありませんが、選択肢の1つです。
  • 多段階のマッチングを行う。
    • 繰り返されるグループを1回のマッチングで捕捉する
    • 次に別の正規表現を実行して、そのマッチを分割する

参考文献


以下は、マッチングの例です。 <some;words;here> を使用した例です。 exec ループを使用し、さらに ; で分割し、個々の単語 ( ideone.comの記事も参照してください。 ):

var text = "a;b;<c;d;e;f>;g;h;i;<no no no>;j;k;<xx;yy;zz>";

var r = /<(\w+(;\w+)*)>/g;

var match;
while ((match = r.exec(text)) != null) {
  print(match[1].split(";"));
}
// c,d,e,f
// xx,yy,zz

使用されているパターンは

      _2__
     /    \
<(\w+(;\w+)*)>
 \__________/
      1

これは <word> , <word;another> , <word;another;please> など。グループ2は、任意の数の単語をキャプチャするために繰り返されますが、それは最後のキャプチャを保持することができるのみです。単語のリスト全体がグループ1によって捕捉される。この文字列は次に split のようにセミコロンで区切られる。

関連する質問