18

私はしばらくの間正規表現を行ってきましたが、特定のルールが行う微妙な点については専門家ではありません。常に(.*?)マッチングを行ってきましたが、制限付きで、最初のチャンスがなくなることを理解していました。一方、(.*)?継続し、より貪欲になります。

でも、そう思う理由は何もありません。たまに読んだからだと思います。

今知りたいのですが、違いはありますか?もしそうなら、それは何ですか...

4

4 に答える 4

14

(.*?)欲張りでない一致を含むグループです。

(.*)?貪欲な一致を含むオプションのグループです。

于 2012-12-04T14:48:10.217 に答える
7

他の人は、欲張りマッチと非欲張りマッチの違いを指摘しています。これは、実際に見ることができるさまざまな結果の例です。正規表現はホスト言語に埋め込まれていることが多いので、Perlをホストとして使用します。Perlでは、一致を括弧で囲むと、それらの一致の結果が特別な変数に割り当てられます。したがって、この場合、一致は同じである可能性がありますが、それらの変数に割り当てられているものはそうではない可能性があります。

たとえば、一致文字列が「hello」であるとします。どちらのパターンもそれに一致しますが、一致する部分($ 1)は異なります。

'hello' =~ /(.*?)l/;
# $1 == 'he' 

'hello' =~ /(.*)?l/;
# $1 == 'hel'
于 2012-12-04T14:48:14.413 に答える
5

*「ゼロ以上」を意味するため、すべてが少し混乱します。両方?のはまったく異なり、それぞれの異なる例でより明確に示すことができます。

fo*?fあなたがそれを提供する場合にのみ一致しますfoo。つまり、これ?により、マッチが欲張りになりません。削除すると一致しfooます。

fo?一致fしますが、fo。つまり、これ?により一致がオプションになります。適用される部分(この場合のみo)は、0回または1回存在する必要があります。それを削除すると、一致が必要になります。その場合、1回だけ存在する必要があるため、一致するのは1回だけfoです。

また、正規表現ではさまざまな意味がありますが、?もう1つあります。aの?直後は、ルックアラウンド(などのいくつかの特別な操作のプレフィックスです。つまり、その意味はあなたが尋ねるもののどれとも似ていません。

于 2012-12-04T14:58:49.613 に答える
5

?異なる意味を持っています。

  1. 文字またはグループの後に続く場合、それは数量詞であり、前の構成の0または1回の出現に一致します。詳細はこちらをご覧ください

  2. 数量詞に続く場合、その数量詞の一致動作を変更して、怠惰/貪欲に一致させます。詳細はこちらをご覧ください

于 2012-12-04T14:55:34.147 に答える