1

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

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

我想知道如何在使用Joker的字符串 中找到特定单词 say .. 的存在strjava.lang.String.matches()

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

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

4

3 回答 3

2

问题是.*默认情况下点 in 不匹配换行符。如果你想匹配换行符,你的正则表达式必须有 flag 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
于 2013-07-11T07:46:10.203 回答
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"));
}

或者,您可以使用 aPatternfind

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");
    }
}
于 2013-07-11T07:47:47.023 回答
1

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

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
}
于 2013-07-11T07:50:15.843 回答