【问题标题】:Regex: not matching line if it has something unwanted正则表达式:如果有不需要的东西,则不匹配行
【发布时间】:2016-10-19 20:03:01
【问题描述】:

我似乎仍然无法消极地向后看。我有一种情况,我希望能够匹配其中包含某个字符串的所有行,前提是它们 在其之前有某个其他字符串 anywhere。我希望能够找到所有带有“_view”且后面没有“ora”的行。所以“blahblahorablahblah_view”不应该匹配,但“blahblah_view”应该匹配。我已经尝试将(?<!ora)_view 配对,但它总是会遇到一些在“_view”之前不是“ora”的东西。 [^(ora)] 似乎也没有得到我想要的。

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

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

我使用的不是 Perl 或 Java,而是 IDE (PhpStorm),所以适用于 grep 的东西应该已经足够好了。

【问题讨论】:

  • 您使用的是什么 IDE?另外,为什么要使用lookbehind? Regex101 不支持无限宽度的后视,因为该站点支持 PCRE/JS 和 Python 正则表达式风格。这仅在一些正则表达式风格中受支持。您可以使用^(?!.*oca.*_view).*_view 基于一个lookahead
  • 能否格式化您的问题并添加您使用的 IDE?
  • @Jan:这个不能保证“oca”在“view”之前,它可以在字符串的任何位置。
  • @CasimiretHippolyte:没错,^(?:(?!oca).)*view.*$

标签: regex negative-lookbehind


【解决方案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 正则表达式引擎(允许可变长度后视) 或至少 Java 正则表达式引擎(允许有限可变长度后视),此处无法使用lookbehind。

【讨论】:

  • 嗯...我宁愿回溯也不愿梳理那根纱线。但这很好用,谢谢。愿意解释一下你是怎么得到的吗?我永远不会想到这一点。我可以理解行首锚点,我理解分组、前瞻和贪婪.*,但我不明白为什么_view 出现在分组中,然后又出现在分组之外。跨度>
  • @Opux: "view" '出现在分组中' 以防止最终的 '_' 成为子字符串 _view 的开头,直到达到 _view(这样做允许使用贪婪量词而不是较慢的非贪婪量词)。 (?!...) 是一个否定的前瞻,意味着不跟随
猜你喜欢
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 2011-02-27
  • 2012-11-12
  • 2011-10-28
  • 1970-01-01
  • 2014-09-30
相关资源
最近更新 更多