正则表达式匹配器防止重复搜索字符串

时间:2017-05-07 08:27:36

标签: java regex

我在这里找到了这个程序来搜索句子中的连词。 我做了一个数组:

SELECT * from icweb.tbl_message 
where 
(to_id LIKE '%85' and to_id LIKE '85%' and to_id LIKE '%85%')

正如您所看到的,有public static final String[] SUB_CONJS = new String[] { "after", "afterwards", "although", "as if", "as long as", "as much as", "as soon as", "as though", "because", "before", "by the time", "even if", "even though", "if", "in order that"... //some more }; "if"

等重复版

我用匹配器搜索它们:

"as if"

例如,如果我将String toSearch = "(?i)\\b(" + String.join("|", SUB_CONJS) + ")\\b"; Pattern pattern = Pattern.compile(toSearch); Matcher matcher = pattern.matcher(text); int count = 0; while (matcher.find()) count++; 放入"as if"text等于2,因为匹配器搜索了count"if"。有没有办法解决这个问题?感谢

1 个答案:

答案 0 :(得分:1)

正如Pshemo所写,您的代码示例在测试字符串"as if":1匹配时返回所需的结果。

这是因为"if"不是"as if"的前缀。事实上,除了Pshermo之外,你的正则表达式中出现"if""as if"的顺序并不重要,因为它们不是彼此的前缀。

当您在列表中以“as”开头的其他字词添加"as"时,问题会变得更加复杂。在这种情况下,正则表达式实际上“消耗”了“as”,忽略了潜在的较长匹配。

通过在搜索之前相应地对搜索字词进行排序,可以轻松解决此问题:

Comparator<String> prefixesLast = (s1, s2) -> {
    if (s1.startsWith(s2)) return -1;
    if (s2.startsWith(s1)) return 1;
    return s1.compareTo(s2);
};

或者,为了使其更简单,只需按字符串顺序排序,但按降序排序:

Comparator<String> descending = (s1, s2) -> return s2.compareTo(s1);

使用排序列表生成正则表达式应确保始终找到最长匹配。