は私が前にではなく、最後に固定するとき非貪欲正規表現マッチが唯一の非貪欲になることがわかった:アンカーとき正規表現
$ echo abcabcabc | perl -ne 'print $1 if /^(a.*c)/'
abcabcabc
# OK, greedy match
$ echo abcabcabc | perl -ne 'print $1 if /^(a.*?c)/'
abc
# YES! non-greedy match
は今、これを見て最後まで:
$ echo abcabcabc | perl -ne 'print $1 if /(a.*c)$/'
abcabcabc
# OK, greedy match
$ echo abcabcabc | perl -ne 'print $1 if /(a.*?c)$/'
abcabcabc
# what, non-greedy become greedy?
なぜですか?どのように印刷されませんabc
以前と同じ?
(問題は私のGoコードにありますが、簡単にするためにPerlで説明しています)。
'/(a.c *?)$ /'は 'abcabcabc'の最後の 'abc'と一致します。あなたが最後に固執しているので、cは非貪欲にする必要があります。 –
@AdityaJ。、Nah、あなたは "アルゴリズム"を変更しました。あなたの "解決策"については、 '*?'がなくても、 '/(a.c)$ /'のように動作しても、それでも動作します。しかし、お試しいただきありがとうございます。 – xpt
'。*? 'を使うと、正規表現エンジンは、量指定子で許可されている最小文字数(**ゼロ**)と一致し始めます。その後、エンジンは前進して次のトークンを試行します。これは失敗し、エンジンはそのマッチをバックトラックして展開します。プロセスは繰り返されます。正規表現エンジンは進んだり、失敗したり、逆戻りしたり、一致を再開したり、進歩したり、失敗したりします。これは否定の場合です。/ a [^ a] * c $/' – hwnd