私はこの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
ループに一致します以下は、exec
ループを使用して、テキスト内の<some;words;here>
を照合し、;
で分割して個々の単語を取得する例です( 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
です。
これはどうですか? "foo bar baz".match(/(\w+)+/g)
文字列をどのように分割するかについてより複雑な要件がない限り、それらを分割し、初期文字列を返すことができます。
var data = "foo bar baz";
var pieces = data.split(' ');
pieces.unshift(data);
「g」を使用してみてください。
"foo bar baz".match(/\w+/g)