我有一个包含新行字符的字符串说...
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.*);
答案 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"));
}
或者,您可以使用Pattern
和find
:
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
}