java - 负向先行匹配字符串,除非它出现在特定单词中。

标签 java regex

我正在尝试找到一种方法来确定一行是否包含特定字符串,同时如果它出现在某些单词中则不匹配。我已经部分工作了,但是如果排除词之一以关键字开头,它就会失败。

例如,这个正则表达式: ^((?!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).*

Demo

<小时/>

如果将 . 移到否定前瞻之前,它就会起作用:.(?!...)

我还会制作* repetition lazy ,所以它不需要回溯那么多(并不总是如此,但在这个例子中是这样)。另外,如果您想匹配整行并且仅捕获 tom 的实例,请创建包含 .(?!...) non-capturing 的组。并用贪婪的 .* 结束表达式:

^(?:.(?!custom|onetomany|manytomany|atom|tomcat|tomorrow|automatic))*?(tom).*

Demo

关于java - 负向先行匹配字符串,除非它出现在特定单词中。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23921697/

相关文章:

java - getApplicationContext() 处的空指针异常

java - Cloudinary Java直接上传BAD REQUEST错误

java - 如何使异步任务在 Java 8 中具有较低的优先级?

php - 用 preg_replace_callback 替换 preg_replace() e 修饰符

javascript - JavaScript 中的动态与内联 RegExp 性能

c# - 正则表达式帮助示例模式。 C#

java - 简单的java正则表达式问题

java - 如何用前导零写入 csv?

java - 寻找一种简洁的方法通过 Controller 的 Model 对象向 Spring MVC 中的每个页面添加标题信息

Python 使用 Regex 在大字符串中查找具有动态值的字符串