我想检查输入的特定单词是否在字符串中。我使用了以下代码:
import java.util.*;
import java.io.*;
public class StringTest {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String s1;
s1 = s.next();
String s2 = "this is an accomplishment";
if (s2.contains(s1)) {
System.out.println("you have done it");
} else
System.out.println("try another word");
}
}
如果我输入“com”这个词,我会得到结果
你做到了
但“com”实际上只是“成就”一词的一部分。我想在这种情况下的结果是
尝试另一个词
因为s2
不包含完整的单词“com”。我也试过了indexOf()
,但也得到了相同的结果。我应该以什么方式进行?
答案 0 :(得分:2)
最好的正则表达式方法可能是
Pattern p = Pattern.compile("\\b" + Pattern.quote(s1) + "\\b");
if (p.matcher(s2).find()) { ... }
它处理单词边界和转义。请注意,编译模式不是免费的。
答案 1 :(得分:1)
特别注意contains()的作用。如果序列存在于String中,则匹配。它无法区分该String中的单独单词。只要'com'出现在该字符串中的任何位置,contains()就会返回true。你希望它只匹配整个单词,包含()不会。
如果给定的字符串出现在空格或标点符号的周围,则可以使用正则表达式进行匹配。在Regular Expressions上尝试Java教程。
或者,更简单地说,您可以沿着空格分开字符串。 String方法split()或另一个Scanner可以很容易地做到这一点。这将为您提供Scanner类称为“令牌”的单词,作为String类的实例。之后,改为使用contains(),使用equals()。正则表达式也可以这样做,但一开始学习它们会更加精疲力竭(但完全值得)。
答案 2 :(得分:0)
代替if(s2.contains(s1))
,请使用以下代码:
if(Pattern.compile("\\b" + s1 + "\\b").matcher(s2).find())
确保import java.util.regex.Pattern;
它将在s2
中搜索与s1
匹配的整个字词。有关更多信息,请参阅以下页面:
Matcher
以搜索指定字符串中的正则表达式。或者,您可以使用
if(s2.matches(".*\\b" + s1 + "\\b.*"))