Javascriptは正規表現を使用して分割されません
-
03-07-2019 - |
質問
この質問を書き始めたので、私が持っていたすべての質問に対する答えを見つけたと思いますが、他の人に役立つかもしれないし、より明確にすることが役立つかもしれないので、とにかく投稿したいと思いました。
JavaScript関数splitでlookaheadを使用した正規表現を使用しようとしました。何らかの理由で、matchを呼び出したときに一致が見つかっても、文字列は分割されませんでした。元々、問題は正規表現で先読みを使用しているためだと思っていました。簡単な例を示します:
機能しない:
"aaaaBaaaa".split("(?=B).");
作品:
"aaaaBaaaa".match("(?=B).");
問題は、分割された例では、渡された文字列が正規表現として解釈されていなかったということです。引用符の代わりにスラッシュを使用すると、問題が解決するようです。
"aaaaBaaaa".split(/(?=B)./);
次の馬鹿げた例で理論を確認しました:
"aaaaaaaa(?=B).aaaaaaa".split("(?=B).");
一致関数が正規表現を持っていると仮定しているのに、分割関数はそうではないというのは奇妙だと思う人はいますか?
解決
String.split
は、最初のパラメーターとして文字列または正規表現を受け入れます。 String.match
メソッドは、正規表現のみを受け入れます。
String.match
は、渡されたものなら何でも試して動作すると想像します。したがって、文字列を渡すと、それは正規表現として解釈されます。 String.split
メソッドは、正規表現と文字列を受け入れることができるため、これを行う贅沢はありません。この場合、推測するのは愚かです。
編集:(From:" JavaScript:The Definitive Guide")
String.match
を使用するには、正規表現が必要です。渡される引数は、一致するパターンを指定する RegExp
オブジェクトである必要があります。この引数が RegExp
でない場合、最初に RegExp()
に渡すことで引数に変換されますコンストラクタ。
他のヒント
正しく思い出せば(ここで非常に間違っている可能性があります)、spexメソッドは正規表現エンジンが広く使用される前にjavascriptで実装されていたため、おそらく下位互換性のためです。