与单词列表不匹配的单词的正则表达式

时间:2015-07-06 19:55:29

标签: regex regex-negation

我需要一个正则表达式来匹配不在我所拥有的特定列表中的单词。

这是我尚未制作的系统,但我需要用于过滤。显然它根据给定的正则表达式过滤字段,字段只包含一个单词。所以我想要全字匹配。

例如,我想要番茄或土豆以外的任何词,到目前为止我的正则表达式:

^(?!(Potato|Tomato))

我正在测试我的正则表达式here。 当我输入马铃薯时,我得到:

  

您的模式与主题字符串不匹配。

这是我期望的结果,但每当我输入除番茄和马铃薯之外的任何其他东西,例如"巧克力"我明白了:

  

没有提取匹配组。

     

这意味着您的模式匹配但没有(捕获   (groups))匹配主题字符串中的任何内容。

我尝试将表达式更改为:

([[:alnum:]])*^(?!(Potato|Tomato))

意思是,除了单词" Tomato"之外,我想要任何字母数字字符组合。和"马铃薯",但我得到了相同的结果。

我不知道如何更改我的正则表达式,因此它有一个符合我需要的捕获组

2 个答案:

答案 0 :(得分:4)

您正在使用的正则表达式

^(?!(Potato|Tomato))

这个正则表达式意味着“匹配开头的零长度字符串,后面没有'Potato'或'Tomato'”

你正在使用的正则表达式是一个负向前瞻。参考:here 此外它没有捕获任何东西,因为这个正则表达式中唯一的捕获组只能匹配你不允许的“马铃薯”或“番茄”。

捕获组由圆括号定义但是如果有“?”在左圆括号前面,它不被视为捕获组。

如果你想在上面的正则表达式中有一个捕获组,请使用:

^((?!(Potato|Tomato)))

现在,如果您针对字符串“bracket”测试此正则表达式,您将在[0-0]处获得0长度匹配。

您正在寻找的正则表达式是:

^(?!(Potato|Tomato)$)(\w*)

答案 1 :(得分:1)

你的正则表达式是一个零长度的正则表达式。试试这个:^(?!(Potato|Tomato))\w*。这将与巧克力相匹配。如果您想捕获巧克力,请执行以下操作:^(?!(Potato|Tomato))(\w*)

Demo