正则表达式:如果有不需要的东西则不匹配行

Regex: not matching line if it has something unwanted

我似乎仍然无法得到负面的回顾。我有一种情况,我希望能够匹配其中包含特定字符串的所有行,前提是它们 具有特定的其他字符串 anywhere 在它之前。我希望能够找到所有带有“_view”但后面没有 "ora" 的行。所以“blahblahorablahblah_view”不应该匹配,但是“blahblah_view”应该匹配。我试过将 (?<!ora)_view 配对,但它总是命中某些东西 w/that 在“_view”之前有任何不是 "ora" 的东西。 [^(ora)] 似乎也没有得到我想要的东西。

我也尝试向 Perl: Matching string not containing PATTERN 学习,但这并没有让我有任何收获。 (它似乎没有按照我想要的方式混合正面和负面匹配)

我也在使用 https://regex101.com 了解它是用于诊断正则表达式的强大而通用的工具。

我没有使用 Perl 或 Java,而是 IDE (PhpStorm),所以适用于 grep 的内容应该足够好。

至少有两种可能:

使用环视的那个:

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

(容易写但效率不高,因为可能会造成大量回溯)

使用否定符的类:

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

或带有所有格量词的版本(如果可用):

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

或模拟所有格量词的版本(如果不可用):

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

除非您的 IDE 使用 .net 正则表达式引擎 (允许可变长度回顾) 或至少 Java 正则表达式引擎 (允许有限的可变长度后视),这里无法使用后视。