使用java regex在字符串中搜索单词及其否定

时间:2014-02-13 17:51:00

标签: java regex string

我想在使用java的字符串中找到单词及其否定。例如,说

String str = "The product contains no sodium but contains potassium"

我在这个字符串中搜索“钠”和“无钠”。我想根据结果做出具体行动。但是,我怎样才能确保一旦在该字符串中发现“无钠”,钠就不会使用正则表达式获得匹配。我有一个这样的单词(子串)列表,我需要在一大组字符串中搜索。

现在,我正在使用一个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);

2 个答案:

答案 0 :(得分:0)

如果您只想像往常一样匹配no sodium,那么

但是,如果您想仅匹配之前没有sodium的{​​{1}},那么它将是

no

答案 1 :(得分:0)

匹配器不会找到重叠的匹配项,因此对于您的示例,这已经完成了您想要的操作。但是,如果您有多个具有共同前缀的字符串,例如“钠”和“氯化钠”,则可能会遇到一些问题。

为了确保始终获得最长的匹配,请确保在更改期间始终拥有更长的字符串。因此,只要您的正则表达式类似\b(sodium chloride|sodium)\b,正则表达式引擎将首先尝试sodium chloride,然后在必要时回退到sodium

在这种情况下,您应该在创建正则表达式之前按字符串长度(前面最长)对wordsSearch进行排序。