【问题标题】:Complicated regex to match anything NOT within quotes复杂的正则表达式匹配不在引号内的任何内容
【发布时间】:2018-01-25 07:32:24
【问题描述】:

我有这个正则表达式,它可以扫描文本以查找单词 very: (?i)(?:^|\W)(very)[\W$],它有效。我的目标是升级它并避免在引号内、独立或作为较长块的一部分时进行匹配。

现在,我有另一个正则表达式,它匹配不在大引号内的任何内容:(?<![\S"])([^"]+)(?![\S"]),它也可以工作。

我的问题是我似乎无法将它们结合起来。例如字符串:

Fred Smith very loudly said yesterday at a press conference that fresh peas will "very, very defintely not" be served at the upcoming county fair。在这一点上,我们有 3 个 very 实例,但我只对匹配第一个感兴趣并忽略整个 Smith 引用。

【问题讨论】:

  • 为它设置赏金。我想看看如何匹配不在奇数个引号之后且至少在一个引号之前的字符串。

标签: regex


【解决方案1】:

这个正则表达式

(?i)(?<!(((?<DELIMITER>[ \t\r\n\v\f]+)(")(?<FILLER>((?!").)*))))\bvery\b(?!(((?<FILLER2>((?!").)*)(")(?<DELIMITER2>[ \t\r\n\v\f]+))))

可以在两种情况下工作:

  • 您的正则表达式引擎允许无限后视
  • 引号由空格分隔

试试http://regexstorm.net/tester

【讨论】:

    【解决方案2】:

    您所描述的内容很难用正则表达式处理。很难确定您是否在报价范围内。您的第二个正则表达式无效,因为它只忽略直接在引号右侧的第一个 very 并且仍然与第二个匹配。

    this answer 中汲取灵感,这反过来又引用了另一个答案,该答案描述了如何regex match a pattern unless ... 我可以捕获您想要的匹配项。

    基本思想是使用交替| 并匹配所有你不想要的东西,然后最后匹配(并捕获)你在最后一个子句中想要的东西。像这样的:

    "[^"]*"|(very)
    

    我们匹配第一个子句中的引用字符串,但我们没有将它们捕获在一个组中,然后我们匹配(并捕获)第二个子句中的单词very。您可以在捕获的组中找到此匹配项。如何引用捕获的组取决于您的正则表达式环境。

    有关测试用例,请参阅此regex101 fiddle

    【讨论】:

    • 我看到花括号内的单词仍然匹配。我需要忽略里面的任何东西。
    • 这种方法的工作方式是使用捕获组。您主动匹配引用的字符串,但您不捕获它(没有捕获组),您只使用very 的捕获组,然后您可以引用它。引用捕获组取决于您的正则表达式环境,但我不确定您使用的是什么。
    猜你喜欢
    • 2017-05-25
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多