Java 文本与组中单词的子字符串错误匹配

Java 文本与组中单词的子字符串错误匹配,java,regex,Java,Regex,我想检查文本,看看它是否以what或who开头,并且是一个问题类型,因此我编写了以下代码: private static void startWithQOrIf(String commentstr){ String urlPattern = "(|who|what).*\\?.*$"; Pattern p = Pattern.compile(urlPattern,Pattern.CASE_INSENSITIVE); Matcher m = p.matcher

我想检查文本,看看它是否以what或who开头,并且是一个问题类型,因此我编写了以下代码:

private static void startWithQOrIf(String commentstr){

     String urlPattern = "(|who|what).*\\?.*$";
     Pattern p = Pattern.compile(urlPattern,Pattern.CASE_INSENSITIVE);
        Matcher m = p.matcher(commentstr);
        if (m.find()) {
            System.out.println("yes");
        }
}
一切都很好,但例如,当我尝试:

whooooooooo is the follower?
也会匹配,但不应该匹配,因为我在寻找谁不是谁


有什么想法吗?

您可以使用单词边界来确保一个完整的单词
\b

(|who|what)\\b.*\\?.*$
            ^^
如果替换组中的单词应该出现在字符串的开头,您可以使用
匹配项
并删除
$
锚定:

 String urlPattern = "(|who|what)\\b.*\\?.*";
 Pattern p = Pattern.compile(urlPattern,Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher(commentstr);
    if (m.matches()) {                        // < - Here, matches is used
        System.out.println("yes");
    }
String urlPattern=“(|谁|什么)\\b.\\\?*”;
Pattern p=Pattern.compile(urlPattern,Pattern.CASE\u不区分大小写);
Matcher m=p.Matcher(commentstr);
如果(m.matches()){/<-这里使用matches
System.out.println(“是”);
}

请注意,
(| who | what)
匹配空字符串,或
who
,或
what
。如果您不打算允许使用空字符串,请仅使用
(who | what)

您必须使用单词边界

String urlPattern = "\\b(who|what)\\b.*\\?.*$";

你知道这个
(|谁|什么)
是做什么的吗?@AvinashRaj谢谢你是的,我在下面的一个答案中学到了。谢谢你对这件事的小心