Java:在字符串中匹配短语
我在数据库中有一个短语列表(短语可能由一个或多个单词组成)和一个输入字符串。我需要找出哪些短语出现在输入字符串中Java:在字符串中匹配短语,java,database,matching,phrase,Java,Database,Matching,Phrase,我在数据库中有一个短语列表(短语可能由一个或多个单词组成)和一个输入字符串。我需要找出哪些短语出现在输入字符串中 有没有一种在Java中执行这种匹配的有效方法 下面是一个使用java的解决方案。由于您没有对使用的字符串进行任何指定,所以我考虑一个通用示例< /P> Pattern p = Pattern.compile("cat"); // Create a matcher with an input string Matcher m = p.matcher("one cat,"
有没有一种在Java中执行这种匹配的有效方法 下面是一个使用java的解决方案。由于您没有对使用的字符串进行任何指定,所以我考虑一个通用示例< /P>
Pattern p = Pattern.compile("cat");
// Create a matcher with an input string
Matcher m = p.matcher("one cat," +" two cats in the yard");
boolean b = m.matches(); // Should return true
希望有帮助
参考:
检查准备好的语句是否适合数据库,并且重复调用的速度更快,因此如果您有多个输入,它仍然应该是快速的,在循环中执行
当然,您可以将所有短语加载到RAM和地图中。准备缓慢,如果您有多个调用,而不仅仅是一个输入,可能会更快。但是数据库通常是非常高效的搜索工具 您可以将数据库中的搜索短语组织成一个基于公共开头的树。然后,您可以逐个字符地分析字符串,以尝试匹配该树的节点 一个快速破解方法是:
find
,直到找到所有短语或输入结束,从要查找的剩余短语集中删除匹配项public静态布尔hasallphrasesinput(列出短语、字符串输入){
Set phrasetofind=newhashset();
StringBuilder sb=新的StringBuilder();
for(字符串短语:短语){
如果(sb.length()>0){
某人附加(“|”);
}
某人附加(句型、引语(短语));
短语stofind.add(短语.toLowerCase());
}
Pattern=Pattern.compile(sb.toString(),Pattern.CASE不区分大小写);
Matcher Matcher=pattern.Matcher(输入);
while(matcher.find()){
短语stofind.remove(matcher.group().toLowerCase());
if(phrasesToFind.isEmpty()){
返回true;
}
}
返回false;
}
一些警告:
- 上面的代码将短语匹配为单词的子字符串。如果只有完整的单词匹配,则需要将单词边界(“\b”)添加到生成的正则表达式中
- 如果某些短语可能是其他短语的子字符串,则必须修改代码
- 如果需要匹配非ASCII文本,则应添加regexp选项
,并使用合适的Pattern.UNICODE\u CASE
调用Locale
,而不是toLowerCase(Locale)
toLowerCase()
sql = "SELECT phrase " +
" FROM phrases " +
" WHERE phrase LIKE $1";
PreparedStatement pstmt = conn.prepareStatement (sql);
// probably repeated, if more than one input:
pstmt.setString (1, "%" + input + "%");
ResultSet rs = pstmt.executeQuery ();
public static boolean hasAllPhrasesInInput(List<String> phrases, String input) {
Set<String> phrasesToFind = new HashSet<String>();
StringBuilder sb = new StringBuilder();
for (String phrase : phrases) {
if (sb.length() > 0) {
sb.append('|');
}
sb.append(Pattern.quote(phrase));
phrasesToFind.add(phrase.toLowerCase());
}
Pattern pattern = Pattern.compile(sb.toString(), Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
phrasesToFind.remove(matcher.group().toLowerCase());
if (phrasesToFind.isEmpty()) {
return true;
}
}
return false;
}