Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:String.contains与单词完全匹配_Java_String - Fatal编程技术网

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