Java正则表达式检查包含Web地址的字符串

时间:2014-03-13 10:37:41

标签: java regex

我有字符串模式,如下所示:

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

有谁知道为什么会这样?

3 个答案:

答案 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添加到正则表达式中。