2

私はSCJP試験の勉強をしていますが、次の模擬問題が私を危険にさらしました。ツールの説明はあまり良くなかったので、SOの知識のある人に説明してもらえるといいなと思います。

の正規表現をC.*L使用して、キャプチャする単語を特定しますCooLooLCuuLooC

を選択しCooL and CuuLました。この選択の理由は、Cの開始一致を探し、それが見つかるまで任意の文字を0回以上取得してからL、終了すると信じていたためです。

ただし、答えは実際にはCooLooLCuuLです。L最初の2つがどのように通過するかについて私は混乱していますか?

誰かが私のためにこれを片付けてくれませんか?

ありがとう

4

3 に答える 3

3

役立つ可能性があるもう 1 つの説明:

.*、何にでも一致します (デフォルトでは、改行を除く!!!!)、0回以上 - 一般的には理解できました。ただし、.*?その定義も満たしています。違いは貪欲さ...

  • .*他のものと一致しなくなるまで、何にでも一致します ('greedy' または 'eager')
  • .*?次の式が一致するまで、何にでも一致します ('non-greedy' または 'reluctant')。

したがって、C.*Lは大文字Cの を見つけて、 と一致ooLooLCuuLooC.*ます。次に、大文字と一致する必要があることがわかりますL。文字列の最後にいることは不可能であるため、 に一致する場所に移動し、 にその文字をあきらめLさせます。結果:.*LooCCooLooLCuuL

使用する場合は、C.*?Lを見つけてから に一致しC、次に に一致するかどうかをoテストoLます。これは失敗し、一致させて次の への一致ooをテストします。これは成功し、 を返します。LLCooL

CooLまたはCuuL(つまり、で始まり、Cで終わる任意の文字列L)のいずれかに一致するための 3 番目のオプションは、 C[^L]*L. Cこれは、次に大文字ではない任意の数の文字L、次に大文字に一致しLます。

于 2011-11-22T21:03:55.397 に答える
2

これはgreedy searchand であり、できるだけ多くの文字に一致し、文字が見つかるまでバックトラックするためLです。

この問題についてより多くの情報を得るには、次の優れたリソースがあります: http://www.regular-expressions.info/repeat.html

于 2011-11-22T20:45:33.467 に答える
2

C.*LCooLooLCuuL欲張りだから似合う。有効な一致を見つけるために一致させる文字列がなくなるまで、一致を見つけながら、できる限り噛み砕こうとします。最初の一致が見つかったときに満たされるため、C.*?L貪欲ではないため、に一致します。CooL2 番目の一致CuuLが見つかるのに十分な文字列を除外することさえあります。

于 2011-11-22T20:43:37.407 に答える