排除一个捕获组的正则表达式

18
我正在编写一个正则表达式,需要捕获以“get”开头的复数字符串。例如getContactsgetBuildings应该匹配正则表达式。但有时文本可能等于getDetails或get**Details。我不想让正则表达式包含这些。
我可以编写一个包括匹配组"Details"的正则表达式,但我想排除该捕获组,而不是包括它。
[Gg]et?\w+([Dd]etail)s

我对正则表达式不是很擅长,但这是我对我写的内容的理解:

匹配 "g" 或 "G",后跟 "et",然后是可选的任何单词字符,接着是匹配组,最后跟着 "s"。

如何排除包含单词 "details" 的结果?


getDetailsAndBars 应该匹配还是不匹配? - Qtax
应该匹配 getInfo 吗?你原来的正则表达式似乎排除了这种情况。 - Gus
4
为什么你在[Gg]et?中加了问号?问号只是使t变得可选。这是你的意图吗? - Justin Morgan
2个回答

17

这样的代码可能适合你:

\b[Gg]et(?!\w*[Dd]etails)\w+s\b

4
负向先行断言 (?!...) 确保了 Details 不是匹配的一部分,\b 用于锚定单词的开头/结尾,否则 GetBars 将会在 setGetBarsX 字符串中被匹配到。 - Qtax

10
我相信你正在寻找零宽度负向先行断言......。请参考http://www.regular-expressions.info/lookaround.html了解更多信息。
[Gg]et(?![Dd]etail)\w+s

假设您想排除“Get Details”和“Get Info”,但接受“Get Pages”和“Get MyDetails”(注意:您原始正则表达式中的尾随s已经排除了“Get Info”)

你可能想在那里加上一个尾随的\b$,这样你就不会在getSassDetails中匹配到getSass - Phrogz
太棒了!这更接近了。但是看起来它仍然匹配带有详细信息的字符串:http://regexr.com?301ut 你能告诉我如何排除这些字符串吗? - bittersweetryan
-1,t 后面的 ? 是错误的,而且 op 似乎表明 Details 不必与 get 相邻。 - Qtax
@Qtax 哎呀,是的,我从他的原始代码中复制了那个,当时在考虑负匹配方面,没有注意到这个问题。 - Gus
实际上,负向先行断言覆盖了您在正则表达式中放置的情况,但不包括获取一些详细信息而不包括其他详细信息...因此,如果您也需要排除这一点,则请使用Qtax的解决方案。我只是试图排除以“details”结尾的事物... - Gus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接