2016-12-29 5 views
0
とは一致しません

正規表現について間違っていることを理解するのはかなり困難です。私はかなり複雑な正規表現を持っていますが、少しのものを簡単にするために、これは自分自身を説明するために十分である:正規表現または演算子は+限定子で動作しますが、*

(a*) | (b*) 

ない括弧が必要な場合は必ずましたか?しかし、この正規表現は、b *(a、aa、...、b、bb、...)とa *は一致しません。私が星の代わりに+を使うと、それは明らかに空の文字列と一致しないことを除いて動作します。私はregex101で何のフラグもなしでこれをテストしました。

なぜ、or演算子を空の文字列に一致する部分と一緒に使用できないのですか、またはここで間違っていますか?

+1

しかし、最初の選択肢は* a以外の "a"または "a"、 "wins"のシーケンスの前に* everywhere *とマッチし、2番目と残りはテストされていません。あなたは何をする必要がありますか? –

+0

'a *'は、文字列の先頭の空の部分文字列と一致します。なぜそれは 'b *'と考えられるのだろうか? – user2357112

+0

いくつかの正規表現のフレーバーでは、最も長い試合が勝利します。他の試合では、最初の試合が勝利し、別の選択肢を見つける必要があります。どのフレーバーを使用していますか、別のフレーバーも使えますか? – hvd

答えて

1

としては、コメントで試合a(多分ゼロ)Sまたはb S(も多分ゼロ)の任意の数の任意の数を行いあなたの正規表現を指摘しました。最初の部分式は空の文字列にマッチしますが、正規表現のフレーバーに応じて、b*が一致するかどうかを検討する必要はありません。言い換えれば、文字列bbbの場合、見つかった一致は、bの3つの前にあるaです。

マーカーの周りにマーカを置くことで、一致させる可能性のあるものと一致する可能性があることを確認できます。 ^と通常のケースについて$作業が、デモの目的のために、X((a*)|(b*))Xが良いかもしれません:あなたは簡単にそれが一致していることを、オンラインで確認することができXXXaXXaaXXaaaX、...、XbXXbbXXbbbX、...

+0

ええ、以前はマーカーでテストしていたので、全体をもっと簡単にすることができました。しかし、私はこれについては、私はregexpエンジンは、この場合も欲張りではない、空の部分文字列よりも長いので、私の正規表現がbbに一致しない理由ですか? – Klaus

+0

@Klausこれは、私のコメントに正規表現の味をつけたものです:一部の正規表現の味は、マッチする最初の選択肢を好むものもあれば、最も長いマッチを与えるものもあります。あなたが使っているもの(regex101のもの)は、最初にマッチするものを好むので、 'a *'は 'b *'より優先され、 'a *'は常に一致します。 – hvd

+0

よろしくお願いします。 – Klaus