使用java正则表达式在字符串中搜索单词及其否定

使用java正则表达式在字符串中搜索单词及其否定,java,regex,string,Java,Regex,String,我想使用java在字符串中查找单词及其否定。比如说 String str = "The product contains no sodium but contains potassium" 我在这个字符串中搜索“钠”和“无钠”。我想根据结果采取具体行动。然而,我如何确保一旦在这个字符串中标识出“no-Nasdium”,Nasdium就不会使用regex获得matcher。我有一个这样的单词列表(子字符串),我需要在一大组字符串中搜索 现在,我正在使用arraylist来存储要匹配的单词和字符串

我想使用java在字符串中查找单词及其否定。比如说

String str = "The product contains no sodium but contains potassium"
我在这个字符串中搜索“钠”和“无钠”。我想根据结果采取具体行动。然而,我如何确保一旦在这个字符串中标识出“no-Nasdium”,Nasdium就不会使用regex获得matcher。我有一个这样的单词列表(子字符串),我需要在一大组字符串中搜索

现在,我正在使用arraylist来存储要匹配的单词和字符串,我正在使用它创建一个用于在输入字符串中搜索的模式

String patternString = "\\b(" + StringUtils.join(wordsSearch,"|") + ")\\b"; //making a pattern to search
Pattern pattern = Pattern.compile(patternString);
//using matcher to find the substrings that I have mentioned earlier
Matcher matcher = pattern.matcher(inputString);

如果您只想匹配
无钠
,则与往常一样

但是如果您只想匹配之前没有的钠,那么它将是

(?<!no) sodium

(?匹配器不会找到重叠的匹配,因此对于您的示例来说,这已经可以满足您的要求。但是,如果您有多个具有共同前缀的字符串,例如“钠”和“氯化钠”,则可能会出现一些问题

为了确保始终获得最长的匹配,请确保在替换中始终首先有较长的字符串。因此,只要您的正则表达式类似于
\b(氯化钠)\b
,正则表达式引擎将首先尝试
氯化钠
,然后在必要时返回到


在这种情况下,您应该在创建正则表达式之前按字符串长度(前面的最长)排序<代码> WordStase<代码>。

我想这将取决于您认为是“否定”的。对于具体的例子,<代码> \\((?):否)/代码>将按照您的意愿进行,如<代码> \b(无钠钠)\ b>代码>或<代码> \b(钠无钠)。\\b
。那么你到底在寻找什么呢?否定是指产品确实含有钠或不含钠。在这种情况下,给出产品说明后,我需要确定说明中是否含有钠或类似“不含钠”或“不含钠”等短语@Jerry如果你还没有这样做,请查看Java正则表达式教程。它似乎与您手头的任务有一些关联。@Lazyprogrammer,但这只是让问题突然变得更广泛了。
不含钠
?以及其他许多表示“不含钠”的方法呢?为了可读性,您应该分两步进行。搜索“不含钠”首先。如果没有匹配项,那么就搜索“钠”。另外,要注意单词的分词——你不想让“氨基酸”的存在成为“无酸”的标记。是的,我刚刚意识到,做了一个编辑,添加了一些额外的解释。我认为答案仍然对OP的尝试有意义。但仍然只是单词“钠”将在字符串中正确标识,因为存在由单词边界分隔的单词?如果我错了,请纠正我。@F.JIn general,正则表达式库将不会找到重叠的匹配项。当找到一个匹配项时,匹配者将在上一个匹配项之后开始查找下一个匹配项,因此当“无钠”时如果匹配,匹配者将尝试在“m”之后找到下一个匹配项,这样就不会将“钠”作为单独的匹配项。