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

Regex 正则表达式来查找单词或短语的实例——除非该单词或短语在大括号中,regex,Regex,首先是免责声明。我对regex有些了解,但我不是专家。它们似乎是我一年两次真正需要的东西,所以它们不会停留在我大脑的“顶端” 情况:我想写一个正则表达式来匹配某个单词,我们称之为“鸵鸟”。容易的。除了鸵鸟有时会出现在卷曲的支架内。如果它在一个卷曲的支架里面,那就不是一对。这里的技巧是在花括号内可以有空格。此外,文本通常位于段落内部 这应符合: 我有一只鸵鸟。 这不应匹配: 我的鸸鹋去了{鸵鸟种族名称}。 这应该是一个匹配: 我的鸵鸟去了{鸵鸟种族名称}。 这不应匹配: 我的鸸鹋去了{鸵鸟竞技场}

首先是免责声明。我对regex有些了解,但我不是专家。它们似乎是我一年两次真正需要的东西,所以它们不会停留在我大脑的“顶端”

情况:我想写一个正则表达式来匹配某个单词,我们称之为“鸵鸟”。容易的。除了鸵鸟有时会出现在卷曲的支架内。如果它在一个卷曲的支架里面,那就不是一对。这里的技巧是在花括号内可以有空格。此外,文本通常位于段落内部

这应符合:
我有一只鸵鸟。

这不应匹配:
我的鸸鹋去了{鸵鸟种族名称}。

这应该是一个匹配:
我的鸵鸟去了{鸵鸟种族名称}。

这不应匹配:
我的鸸鹋去了{鸵鸟竞技场}。我的Emu去了{Race Place Ostrich}。


似乎这在正则表达式中是可能的,但我确实看不到

我相信这会起作用,使用前向和后向断言:

我还测试了我的{Ostrich}参加鸵鸟比赛的案例。
(第二个“鸵鸟”匹配)

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

  • 我的{鸵鸟缺少一个括号
    不匹配
  • 我的鸵鸟也有}缺少括号
    将匹配
这可能是可取的,也可能不是可取的


这在.NET正则表达式引擎中起作用,但是,它与PCRE不兼容,因为它使用了不受支持的非固定长度断言。

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

它将返回组中该单词的每个“原始”匹配项。
但是,最后一个的组将是空的;我不知道为什么

无空格解析

^(?:

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

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

虽然正则表达式当然可以按照您的要求编写,但它们可能不是这类事情的最佳工具

正则表达式的一个主要问题是,它们非常擅长于对存在的事物进行模式匹配,但当您开始添加时,除了在混合中之外,它们就没有那么多了

正则表达式的状态不足以在不做大量工作的情况下正确处理此问题,因此我将尝试找到一种不同的解决方案


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

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

首先,使用类似于
{[^}]+}
(使用replace将其更改为空字符串)的正则表达式删除所有括号内的项


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

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


(?

我意识到鸵鸟不是一个合适的名字。在这种情况下,让我们假设鸵鸟是一种汽车;)@Slaks:问得好。不。但是它们里面可能有一些标点符号,我认为@和句号。@Slaks:对我有用,注意我使用的是.NET正则表达式引擎:
Dim re As New regex(“(?你是对的;我不确定我做错了什么。请注意,它不会捕获多个
Ostrich
es。你必须使用
Dim匹配作为MatchCollection=re.matches(inputText)
要获得多个匹配项,那么,我确实相信这是可行的,而且启动起来非常简单。谢谢。这解决了我的问题,谢谢。如果没有其他人获得更多的升级票,我会将其标记为答案。从技术上讲,他们确实用regex解决了问题,但我不知道其他答案是否有效。