【问题标题】:regex match one string only if line does not contain another string仅当行不包含另一个字符串时,正则表达式才匹配一个字符串
【发布时间】:2014-06-26 16:12:20
【问题描述】:

是否有匹配一个字符串的通用正则表达式,但前提是一行不包含另一个字符串?

例如,我想匹配单词apple,但前提是该行不包含banana。所以以下几行:

  1. apple banana - 不匹配
  2. pear apple - 匹配苹果但不匹配梨
  3. apple pear apple - 匹配第一个和第二个苹果,但不匹配梨

我知道

^((?!banana).)*$

将匹配不包含香蕉的行。但我似乎无法将其与仅匹配的苹果相结合。

【问题讨论】:

  • 您可能只需要两个正则表达式。有什么非常迫切的需要一次性完成吗?
  • “香蕉苹果”呢?这是一个可能的选择吗?
  • 您使用的是哪种正则表达式?是PCRE吗?
  • 正则表达式风格是 PCRE,是的。香蕉苹果是可能的 - 我不想用香蕉来匹配任何一行
  • @Michelle 也许吧,我不确定。该应用程序用于文本编辑器的 XML c++.lang 文件中的语法高亮显示。我想匹配/ 字符,但这会破坏// 的注释结构。可能有不同的方法来解决这个问题,但无论如何,这个问题被证明是一个非常有趣的学术练习

标签: regex


【解决方案1】:

你可以使用这个 PCRE 正则表达式:

.*banana.*$(*SKIP)(*F)|\bapple\b

Working Demo

【讨论】:

  • 行仍然可以包含香蕉:“梨香蕉苹果”
  • 哎呀,米歇尔好点,我没有检查那个组合。暂时不接受...
  • @anubhava 看来这次你已经掌握了它:D - 还有一些排列 regex101.com/r/sW8eF9 。我会等一会儿再接受,看看有没有人发反例
  • @Piyuesh 不在 regex101 上,可以通过
  • @anubhava 你可以简单地使用^.*banana.*$(*SKIP)(*F)|\bapple\b
【解决方案2】:

无法发表评论,因为我还没有足够的声誉。但只是为了增加 anubhava 的答案,所以像香蕉苹果香蕉这样的东西会起作用:

\b(?!.*banana)apple\b(?!.*banana)

编辑:

你是对的;不过,Avinash Raj 的回答看起来很有效。

【讨论】:

  • 仍然匹配pear banana apple
【解决方案3】:

你可以试试这个正则表达式,

(?<!banana.)\b(?!.*banana)apple\b

DEMO

.*?banana.*|\b(apple)\b

这将在字符串banana 不存在的行上捕获字符串apple

DEMO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多