2017-08-29 22 views
0

私はthisチュートリアルから正規表現を探しています。このlookaround正規表現にマッチする文字列

これは、存在(または存在しない)を確認するためにルックアラウンドがどのように使用されるかを説明する例がありますが、実際の一致にはルックアサイド内部の正規表現は使用されません。

例では、パターンq(?=u)iは、文字列の終了と照合されています。そしてそれは一致を返さない。

この例を理解しました。
しかし、私はこの正規表現パターンに一致する文字列を考えることはできません。私のlookaroundの理解が正しいなら、私はこの正規表現と一致するStringはないと思う。

正しいですか?そうでなければ、どの文字列がこの正規表現にマッチしますか?

答えて

1

私はこのチュートリアルサイトの大ファンではないんだけど、あなたはそれが実際に言っていることと密接読めば、それは文字列quitと一致するq(?=u)i正規表現と主張することはありません:

はのは、内部の1人の以上を見てみましょうあなたが先読みの意味を理解していることを確認してください。 q(?= u)iを適用して終了しましょう。先読みは正になり、別のトークンが続きます。ここでも、qはqと一致し、uはuと一致します。 再度、先読みからの一致は破棄しなければならないので、エンジンは文字列のiからuに戻る。先読みは成功したので、エンジンはiで続行します。しかし、私はあなたと一致することはできません。したがって、この試行は失敗します。文字列にq個以上の文字列が存在しないため、残りの文字列もすべて失敗します。

先読みの仕組みについてまだ混乱している可能性があります。どちらか、またはチュートリアルのサイトを誤解しています。前者の場合、先読みはと一致し、実際にはを使わずにと一致します。文字列内には何もありません。もちろん

match the letter 'q' 
lookahead to the next character after 'q' and assert that it is 'u' 
then match an 'i' immediately after the 'q' 

、文字列は「終了」失敗し、実際にはすべての文字列が失敗します:だから正規表現はq(?=u)iに述べています。先読みは、qの後にuが続くことを確認するように言いますが、次のパターンは、iがそれに続くと主張することによってこれと矛盾します。

+0

私はあなたに従います、私は私の言語が少し混乱していたと思います。物事をより明確にするために質問を少し変えました。私は 'q(?= u)i'で一致を返す文字列を探しています。 ** quit **は一致を返しません。私はこの正規表現との一致を返す文字列を考えることができませんでした。 –

+1

@gitblame私はあなたが実際に言ったことに従ったとは思わない。この正規表現に一致する_no_文字列があります。再び、先読みは 'qu'を表明し、実際のパターンは' qi'と一致する。明らかに、これはどんな文字列でも必ず失敗します。 –

+0

はあなたの答えの最後の声明を先に読まなかった。今それを理解しています。ありがとう。 –

関連する問題