Java:String.contains与单词完全匹配
在爪哇 如果执行Java:String.contains与单词完全匹配,java,string,Java,String,在爪哇 如果执行term.contains(subterm_1)操作,则返回true。我不想那样。我希望子术语与术语 因此,类似于term.contains(subterm_1)的东西返回false和term.contains(subterm_2)返回true使用indexOf,然后检查是否在位置使用char String term = "search engines" String subterm_1 = "engine" String subterm_2 = "engines" 或者我确信
term.contains(subterm_1)
操作,则返回true
。我不想那样。我希望子术语
与术语
因此,类似于
term.contains(subterm_1)
的东西返回false
和term.contains(subterm_2)
返回true
使用indexOf,然后检查是否在位置使用char
String term = "search engines"
String subterm_1 = "engine"
String subterm_2 = "engines"
或者我确信也有一种正则表达式方法。如果单词总是用空格分隔,那么这是一种方法:
index + length of string plus +1 == ` ` or EOS
String=“搜索引擎”;
String[]parts=String.split(“”);
对于(int i=0;i
我希望子项与术语中的一个词完全匹配
然后不能使用contains()
。可以将术语拆分为单词,并检查是否相等(区分大小写)
由于contains方法验证字符串中是否存在该字符数组,它将始终返回true,因此必须使用Regex进行此验证 如果单词总是按空格分隔,则更容易使用\s正则表达式来获取
这里有一个很好的教程:一种方法是将字符串按空格分割,将其转换为列表,然后使用
contains
方法检查精确匹配,如下所示:
boolean hasTerm = false;
for (String word : term.split("\\s+") {
if (word.equals("engine")) {
hasTerm = true;
break;
}
}
我建议使用单词边界。如果编译像\bengines\b这样的模式,正则表达式将只匹配完整的单词 下面是对单词边界的解释,以及一些示例。 另外,这里是该模式的JavaAPI,它确实包含单词边界 下面是一个使用上述需求的示例
String[] results = term.split("\\s+");
Boolean matchFound = Arrays.asList(results).contains(subterm_1);
以下是输出:
Pattern p = Pattern.compile("\\bengines\\b");
Matcher m = p.matcher("search engines");
System.out.println("matches: " + m.find());
p = Pattern.compile("\\bengine\\b");
m = p.matcher("search engines");
System.out.println("matches: " + m.find());
\b匹配一个单词字符为[a-zA-Z0-9]的单词边界
这应该适合您,并且您可以轻松地重用此方法
matches: true
matches: false
输出:
public class testMatcher {
public static void main(String[] args){
String source1="search engines";
String source2="search engine";
String subterm_1 = "engines";
String subterm_2 = "engine";
System.out.println(isContain(source1,subterm_1));
System.out.println(isContain(source2,subterm_1));
System.out.println(isContain(source1,subterm_2));
System.out.println(isContain(source2,subterm_2));
}
private static boolean isContain(String source, String subItem){
String pattern = "\\b"+subItem+"\\b";
Pattern p=Pattern.compile(pattern);
Matcher m=p.matcher(source);
return m.find();
}
}
单词是否总是用空格分隔?是的单词总是用空格分隔当子项具有正则表达式特殊字符时,这有一个缺陷。例如
isContain(“live”,“l.ve”)
将返回true。我已提交一个编辑以更正此问题。@MendrikaSandratra它在哪里?@bdevloper因为我需要验证我的编辑,我想还没有人验证它。我的更正是使用“\\b”+模式。引号(子项)+“\\b”
所以子项是正则表达式文字
public class testMatcher {
public static void main(String[] args){
String source1="search engines";
String source2="search engine";
String subterm_1 = "engines";
String subterm_2 = "engine";
System.out.println(isContain(source1,subterm_1));
System.out.println(isContain(source2,subterm_1));
System.out.println(isContain(source1,subterm_2));
System.out.println(isContain(source2,subterm_2));
}
private static boolean isContain(String source, String subItem){
String pattern = "\\b"+subItem+"\\b";
Pattern p=Pattern.compile(pattern);
Matcher m=p.matcher(source);
return m.find();
}
}
true
false
false
true