我在这里找到了这个程序来搜索句子中的连词。 我做了一个数组:
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"
。有没有办法解决这个问题?感谢
答案 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);
使用排序列表生成正则表达式应确保始终找到最长匹配。