正则表达式 - 匹配单词的一部分,但有一个例外

时间:2014-07-02 11:09:17

标签: regex

我需要一个能够查找的正则表达式" ship"在任何instacne,所以:船,宇宙飞船,星舰,航运等。但它不需要查找"战舰"。它也需要不区分大小写。目前我已经:

(?!(军舰))(?ⅰ)船

...查找"发货"但仍然抬头看战舰"战舰"感谢它含有" ship"。我试过了:

(?!(军舰))^(?ⅰ)船

......在某种程度上有效,但随后是星舰"例如,没有返回。我确定答案非常简单,但我现在还不能看到。你的帮助会很棒!

4 个答案:

答案 0 :(得分:2)

首先,我想尝试消极的外观:

 /(?<!war)ship/

它应匹配所有单词而不是warship。但它仅获得ship部分。因此,如果您只是通过regexp检查字符串,但是如果您想获得匹配的单词则无法正常工作,这是可以的。

答案 1 :(得分:1)

我想你想要这样的东西,

(?i)^(?!warship$)(?=.*ship).*

DEMO

它匹配任何船舶实例,但不匹配warship

OR

(?i)\b\w*?(?<!war)ship\w*?\b

DEMO

答案 2 :(得分:1)

我建议搜索字符串:

(?i)(\w*ships?)(?<!warship)(?<!warships)

(?i) ...启用不区分大小写的搜索。

(\w*ships?) ...匹配任何以0或更多单词字符开头的字符串,在标记组中包含ship,并且可选地还包含复数s。也可以是(\b\w*ship\w*\b)(\b[a-z]*ship[a-z]*\b)来查找内部任何位置ship的完整单词。

(?<!warship)(?<!warships) ...两个负面的回顾,检查找到的单词是warship还是warships

答案 3 :(得分:1)

看起来你可能正在使用.NET引擎或类似的表达方式,所以你可以使用lookbehind。

首先,你需要一个正则表达式来匹配整个单词:

\w*ship\w*

然后,您可以轻松修改它,使其与war之前ship之前的任何内容都不匹配,使用负面的背后隐藏。

\w*(?<!war)ship\w*

此外,可能没有理由在正则表达式本身中指定不区分大小写标记,只需在创建它时将其应用于正则表达式对象。

相关问题