1

問題:文字列があります。例: 「to」接頭辞なし"to see to be to read"で 3 つの動詞をキャプチャしたいのですが、この場合はとです。beseeread

Regex 101 では、この非常に単純な正規表現を試してみましたが、問題は解決しました。

正規表現:/to (\w+)/g
結果: ['be', 'see', 'read']

好奇心のために、正の先読みを使用してこれを別の regexにしましたが、結果は同じでした。

正規表現:/(?=to \w+)\w+ (\w+)/g
結果: ['be', 'see', 'read']

わかった。奇妙なことに、ブラウザ コンソール(Chrome または Firefox) でこの正規表現を実行すると、結果が異なります。次の 2 つの試行では、同じ結果が得られます。プレフィックスを含む3 つのグループすべてです。to

> 'to be to see to read'.match(/to (\w+)/g)
  ["to be", "to see", "to read"]

> 'to be to see to read'.match(/(?=to \w+)\w+ (\w+)/g)
  ["to be", "to see", "to read"]    

ここで何か不足していますか、それともバグを踏んでいますか?

免責事項:これは宿題ではありません。より大きな問題について検証しているだけです。私は正規表現の専門家ではありませんが、正規表現について少し知っています。

編集: Regex101 にだまされたと思います。それが私に与えたコードサンプルはString#match()アプローチを示しましたが、この関数は結果のグループに応じて正規表現グループを除外しません。RegExp#exec()マッチをループするのが一番です!

4

1 に答える 1

1

Javascript でグループをキャプチャする正しいRegExp#exec方法は、while ループでメソッドを使用することです。

var re = /to (\w+)/g,
    matches = [],
    input = "to see to be to read";
while (match = re.exec(input))
   matches.push(match[1]);

console.log(matches);
//=> ["see", "be", "read"] 
于 2014-01-21T18:28:06.987 に答える