2016-06-17 8 views
0

私はまだ否定的なlookbehindを得ることができないようです。 がない場合は、には他の特定の文字列があります。その前には、の文字列が含まれているすべての行を一致させることができます。私はそれらの後ろに "ora"を持たない "_ view"があるすべての行を見つけることができるようにしたい。 "blahblah ora blahblah _view"は一致しないはずですが、 "blahblah _view"とする必要があります。私は(?<!ora)_viewを交際しようとしましたが、常に "_view"の前に "ora"でないものがあるw /にヒットします。 [^(ora)]また、私が欲しいものを手に入れていないようです。正規表現:不要な行がある場合は一致する行がありません

また、私はPerl: Matching string not containing PATTERNから学習を試みましたが、それはどこにでも私を得ませんでした。 (それは、私が望むように正と負のマッチを混ぜ合わせるようではありません)

私はhttps://regex101.comを使って正規表現を診断するための堅牢で一般的なツールであると理解しています。

私はPerlやJavaではなくIDE(PhpStorm)を使用しているので、grepに当てはまるものは十分に良いはずです。

+0

どのIDEを使用していますか?また、なぜlookbehindを使用するのですか?サイトがPCRE/JSとPythonの正規表現のフレーバをサポートしているため、Regex101は無限の幅をサポートしていません。これはいくつかの正規表現のフレーバでのみサポートされています。あなたはlook * ahead *に基づいて '^(?!* oca。* _ view)。* _ view'を使うことができます。 –

+0

質問を書式設定し、使用するIDEを追加できますか? –

+0

@Jan:これは "oca"が "view"の前にあることを保証するものではなく、文字列のどこにでも置くことができます。 –

答えて

4

、少なくとも2つの方法が考えられます。

前後参照を使用しています1:

^(?!.*ora.*_view).*_view.* 

(それはバックトラックの多くを引き起こす可能性があるため、効率的な書きやすいではありません)

無効な文字クラスを使用するもの:

^[^o_]*(?:o(?!ra)[^o_]*|_(?!view)[^o_]*)*_view.* 

または所有数量詞とバージョン(利用可能な場合):

^[^o_]*+(?:o(?!ra)[^o_]*|_(?!view)[^o_]*)*+_view.* 

か(利用可能な場合ではない)所有数量をエミュレートしたバージョン:

^(?=([^o_]*))\1(?=((?:o(?!ra)[^o_]*|_(?!view)[^o_]*)*))\2_view.* 

あなたのIDEは、.NET正規表現エンジンを使用している場合を除き、 (可変長のlookbehindを許可する)または少なくともJava正規表現エンジン(これには可変長の見た目の制限があります)は、ここでのlookbehindを使用する方法はありません。

+0

Meh。 ..私はむしろその糸を通して櫛ではなくバックトラックをするだろう。しかし、それは素晴らしい仕事でした。あなたはそれをどのように説明するために気をつけますか?私は決してそれを考え出さなかったでしょう。私は、行頭のアンカーを理解することができます、私はグループ化、先読みと貪欲な '。*'を理解していますが、私はなぜ '_view'がグループ化され、そしてそれから再び外側に現れるのでしょう。 – Opux

+0

@Opux: 'view ''がグループ化されて '_view'に達するまで、最終的な' _ 'が' _view'の部分文字列の先頭にならないようにします(これにより、貪欲量量子は遅い)。 '(?!...)'は否定的な先読みであり、*の後に*がないことを意味します。 –

関連する問題