我想在使用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);
答案 0 :(得分:0)
如果您只想像往常一样匹配no sodium
,那么
但是,如果您想仅匹配之前没有sodium
的{{1}},那么它将是
no
答案 1 :(得分:0)
匹配器不会找到重叠的匹配项,因此对于您的示例,这已经完成了您想要的操作。但是,如果您有多个具有共同前缀的字符串,例如“钠”和“氯化钠”,则可能会遇到一些问题。
为了确保始终获得最长的匹配,请确保在更改期间始终拥有更长的字符串。因此,只要您的正则表达式类似\b(sodium chloride|sodium)\b
,正则表达式引擎将首先尝试sodium chloride
,然后在必要时回退到sodium
。
在这种情况下,您应该在创建正则表达式之前按字符串长度(前面最长)对wordsSearch
进行排序。