我有字符串模式,如下所示:
String wwwPattern = "^(.*[a-zA-Z]+\\.[a-zA-Z]+\\.[a-zA-Z]+.*)$";
当我尝试将此模式与字符串匹配时,我观察到类似这样的内容:
String string1 = "www.stackoverflow.com";
System.out.println(string1.matches(wwwPattern)); // print true, this is OK
String string2 = "test www.stackoverflow.com test";
System.out.println(string2.matches(wwwPattern)); // print true, this is OK
String string3 = "test \r\n www.stackoverflow.com test";
System.out.println(string3.matches(wwwPattern)); //print false
有谁知道为什么会这样?
答案 0 :(得分:4)
使用Pattern.DOTALL
标记将换行符与.
匹配。
要使用内联而非int
标记,请使用(?s)
。
示例强>
String pattern = "(?s)^(.*[a-zA-Z]+\\.[a-zA-Z]+\\.[a-zA-Z]+.*)$";
String input = "test \r\n www.stackoverflow.com test";
System.out.println(input.matches(pattern));
<强>输出强>
true
此外,我会在.*
(第一个和最后一个)之后移动外括号,因此您匹配第1组中的内容。
类似于:"(?s)^.*([a-zA-Z]+\\.[a-zA-Z]+\\.[a-zA-Z]+).*$"
最后,看一下fge的评论(+1)。
答案 1 :(得分:1)
这里可能存在一些问题。
首先,&#34;。*&#34;不符合换行符。其次,如果整个字符串与模式匹配,则使用String.matches()将仅返回true。
如果你只是想在字符串中找到任何匹配项,你可能想尝试使用Pattern和Matcher。
String wwwPattern = ".*([a-zA-Z]+\\.[a-zA-Z]+\\.[a-zA-Z]+).*";
String stringTest = "test \r\n www.stackoverflow.com test";
Pattern p = Pattern.compile(wwwPattern);
Matcher m = p.matcher(stringTest);
System.out.println(m.find()); //print true
答案 2 :(得分:0)
你的正则表达式以^开头并以$结尾,所以:它就像是说&#34;在行尾之前找到像xxx.yyyy.zzz这样的东西&#34; 更新:感谢您的评论
"test \r\n www.stackoverflow.com test"
变为"test \r"
(第一行)和"\n www.stackoverflow.com test"
(第二行)
第一部分不匹配,因为在行尾之前和之后没有两个带字母的点,而.
(正则表达式字符)与行尾不匹配,除非you explicit that (将?s
添加到正则表达式中。