正则表达式查找单词或短语的实例 - 除非该单词或短语在括号中

时间:2010-02-02 21:41:02

标签: regex

首先,免责声明。我对正则表达式了解一点,但我不是专家。它们似乎是我真正需要每年两次的东西,所以它们不会保持“我的大脑”。

情况:我想写一个正则表达式来匹配某个单词,我们称之为“鸵鸟”。简单。除了鸵鸟有时会出现在花括号内。如果它在一个花括号内,那就不匹配了。这里的诀窍是花括号内可以有空格。文本通常也在段落内。

这应该匹配: I have an Ostrich.

这不应该匹配: My Emu went to the {Ostrich Race Name}.

这应该是一个匹配: My Ostrich went to the {Ostrich Race Name}.

这应该不匹配: My Emu went to the {Race Ostrich Place}. My Emu went to the {Race Place Ostrich}.

看起来这是可能的正则表达式,但我肯定没有看到它。

5 个答案:

答案 0 :(得分:2)

我将提供另一种解决方案来实现这一点,它更加健壮(不使用正则表达式断言)。

首先,使用像{[^}]+}这样的正则表达式删除所有括号中的项目(使用replace将其更改为空字符串)。

现在您可以搜索Ostrich(使用正则表达式或简单的字符串匹配,具体取决于您的需要)。

答案 1 :(得分:0)

我相信这会有效,使用前瞻和后瞻断言:

(?<!{[^}]*)Ostrich(?![^{]*})

我还测试了案例My {Ostrich} went to the Ostrich Race.(其中第二个“鸵鸟”匹配)

请注意,前瞻断言:(?![^{]*})是可选的..但没有它:

  • My {Ostrich has a missing bracket将不匹配
  • My Ostrich also} has a missing bracket将匹配

可能是也可能不是。

这适用于.NET正则表达式引擎,但它不兼容PCRE,因为它使用不受支持的非固定长度断言。

答案 2 :(得分:0)

这是一个非常大的正则表达式,几乎可以工作。

它将返回组中单词的每个“原始”出现 但是,最后一组的组将是空的;我不知道为什么。 (用.Net测试)

没有空格的解析

^(?:

    (?:
        [^{]
        |
        (?:\{.*?\})
    )*?

    (?:\W(Ostrich)\W)?
)*$

答案 3 :(得分:0)

虽然正则表达式当然可以写成你所要求的,但它们可能不是这种特殊类型的最佳工具。

正则表达式的一个主要问题是它们非常擅长那些的模式匹配,但是当你开始将除了添加到混合

正则表达式没有足够的状态来在没有很多工作的情况下正确处理这个问题,因此我会尝试找到解决方案的不同路径。

处理大括号的字符标记器很容易编写。

答案 4 :(得分:0)

使用带有否定的正向前瞻似乎可以正确匹配所有测试用例以及多个Ostriches:

(?<!{[^}]*)Ostrich(?=[^}]*)