2016-04-05 10 views
1

私はこの正規表現^([^i]|i(?!s OK))+\.$を2行下で試しました。負のルックアヘッドに失敗しました

1. /tmp/tmp.oW75zGUh4S ... is O. 

2. /tmp/tmp.oW75zGUh4S ... is OK. 

この正規表現は、最初の正規表現と一致すると思われますが、2番目の正規表現は一致しません。それは誰にもマッチしません。どうして?

私が肯定的な先読み^([^i]|i(?=s OK))+\.$を使用すると、最初のものではなく2番目のものと一致し、それが予想される動作です。

+0

マッチングのルールは何ですか? –

+1

ここにあります。しかし、それはあなたが '^。*(?<!OKです。)$'をしたいと思うように見えます、少なくとも、私はそれがより読みやすく、さらにバックトレースで簡単だと思います。 – Wrikken

+0

例:https://regex101.com/r/vA6tY8/1 – Wrikken

答えて

0

regex101.comでテストしたところ、\nが見つかりませんでした。正しい正規表現は^([^i\n]|i(?!s OK))+$です。

ありがとうWrikken。

更新\nがない理由を説明するだけです。 ^(...)+$は、それができない限り、それができるまで全ての文字を食べることを意味する欲張りであり、iではない1つの文字を[^i]が食べることを意味します。また、私は間違って、$はマッチが行末で終わらなければならないことを意味していたので、.が交差するのを防ぐことができるのと同じ方法でマッチが行末境界を越えることは不可能であった右のフラグをセットすることによって、行末の境界を指定します。 $は文字列全体の終わりを意味することができますが、これを防ぐためにフラグを使用していました。

関連する問題