使用java.lang.String.matches()查找匹配项

时间:2013-07-11 07:42:59

标签: java regex

我有一个包含新行字符的字符串说...

str = "Hello\n"+"Batman,\n" + "Joker\n" + "here\n"

我想知道如何使用Joker

在字符串str中找到特定单词的存在说.. java.lang.String.matches()

我发现str.matches(".*Joker.*")会返回false并返回true,如果我删除新的换行符。那么用作str.matches()的参数的正则表达式是什么?

一种方法是...... str.replaceAll("\\n","").matches(.*Joker.*);

3 个答案:

答案 0 :(得分:2)

问题是默认情况下.*中的点与换行符不匹配。如果您希望匹配换行符,则正则表达式必须包含标记Pattern.DOTALL

如果你想将它嵌入.matches()中使用的正则表达式,正则表达式将是:

"(?s).*Joker.*"

但请注意,这也会匹配Jokers。正则表达式没有单词的概念。因此,你的正则表达式确实需要:

"(?s).*\\bJoker\\b.*"

但是,正则表达式不需要匹配所有其输入文本(这是.matches()所做的,违反直觉),只需要匹配。因此,此解决方案甚至更好,并且不需要Pattern.DOTALL

Pattern p = Pattern.compile("\\bJoker\\b"); // \b is the word anchor

p.matcher(str).find(); // returns true

答案 1 :(得分:1)

你可以做一些更简单的事情;这是contains。你不需要正则表达式的力量:

public static void main(String[] args) throws Exception {
    final String str = "Hello\n" + "Batman,\n" + "Joker\n" + "here\n";
    System.out.println(str.contains("Joker"));
}

或者,您可以使用Patternfind

public static void main(String[] args) throws Exception {
    final String str = "Hello\n" + "Batman,\n" + "Joker\n" + "here\n";
    final Pattern p = Pattern.compile("Joker");
    final Matcher m = p.matcher(str);
    if (m.find()) {
        System.out.println("Found match");
    }
}

答案 2 :(得分:1)

你想使用一个使用DOTALL标志的Pattern,它表示一个点也应该匹配新的行。

String str = "Hello\n"+"Batman,\n" + "Joker\n" + "here\n";

Pattern regex = Pattern.compile("".*Joker.*", Pattern.DOTALL);
Matcher regexMatcher = regex.matcher(str);
if (regexMatcher.find()) {
    // found a match
} 
else
{
  // no match
}