我正在尝试找到一种方法来确定一行是否包含特定字符串,同时如果它出现在某些单词中则不匹配。我已经部分工作了,但是如果排除词之一以关键字开头,它就会失败。
例如,这个正则表达式:
^((?!custom|onetomany|manytomany|atom|tomcat|tomorrow|automatic).)*(tom)
将成功排除列出的所有单词,但 tomcat 和 Tomorrow 除外。我假设这是因为我匹配关键字,所以前瞻失败,但我不知道如何修复它。
最佳答案
更新:遗憾的是,除非您在非捕获组中的 .
两侧都放置否定前瞻,否则我无法弄清楚这一点:
^(?:(?!custom|onetomany|manytomany|atom|tomcat|tomorrow|automatic).(?!custom|onetomany|manytomany|atom|tomcat|tomorrow|automatic))*?(tom).*
<小时/>
如果将 .
移到否定前瞻之前,它就会起作用:.(?!...)
我还会制作*
repetition lazy ,所以它不需要回溯那么多(并不总是如此,但在这个例子中是这样)。另外,如果您想匹配整行并且仅捕获 tom
的实例,请创建包含 .(?!...)
non-capturing 的组。并用贪婪的 .*
结束表达式:
^(?:.(?!custom|onetomany|manytomany|atom|tomcat|tomorrow|automatic))*?(tom).*
关于java - 负向先行匹配字符串,除非它出现在特定单词中。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23921697/