両方(a|e|i|o|u)?
と[aeiou]?
同じ効果があると思われますが、パフォーマンスに大きな違いがあるのだろうか.
2 に答える
あなたが与える例では、代替よりもクラスを使用することに大きな利点があります。
例えば:
string 'abcde'
regex1 /(a|e|i|o|u)cde/
regex2 /[aeiou]cde/
その文字列に regex1 または regex2 を適用すると失敗しますが、内部で何が起こっているのでしょうか?
Regex1 は文字列の最初の文字を取り、それが正規表現に一致するかどうかを確認するため、一致する (a|e|i|o|u) に対して「a」をチェックしますが、正規表現エンジンは、他に 4 つの代替があることにも注意します。これが後で失敗するかどうかをテストします。次に、文字列の 2 番目の文字を取得し、それを正規表現の 2 番目のアトミック グループ 'c' と照合します。エンジンは、正規表現が完全に失敗して終了すると判断する前に、ステップを戻し、文字列の最初の文字を eiou と照合しようとします。
一方、正規表現 2 は、文字列 'a' の最初の文字がクラス [aeiou] の文字の 1 つであると判断し、それ以上の状態は作成されないため、2 番目の文字が一致しない場合は、はるかに迅速に失敗して終了します。 regex1 よりも。
エンジンには 2 つのタイプ (決定論的および非決定論的) があるため、正規表現の内部がどのように機能するかについてはさらに多くのことがありますが、より多くの正規表現を読むことに興味がある場合は、何が起こっているかについて非常に詳細な説明があります。
上記はどちらも同じものに一致しますが、違いは [AEIOU] が文字クラスを開始することです。(1|2|3|4|5) と書くのではなく、単純に [1-5] と書くと、同じものとして解釈されます。他の方法を使用すると、毎回一致させたいすべてを再宣言する必要があります。
詳細はここで読むことができますhttp://www.regular-expressions.info/charclass.html