Java正则表达式检查包含web地址的字符串
我有字符串模式,如下所示:Java正则表达式检查包含web地址的字符串,java,regex,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
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
有人知道为什么会发生这种情况吗?使用
模式.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]+\.[a-zA-Z]+).$”
最后,看看fge的评论(+1) 使用
模式.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]+\.[a-zA-Z]+).$”
最后,看看fge的评论(+1) 您的regexp以^开头,以$结尾,因此:这就像说“在行尾之前查找类似xxx.yyy.zzz的内容”更新:谢谢您的评论
"test \r\n www.stackoverflow.com test"
变成“test\r”
(第一行)和“\n www.stackoverflow.com test”
(第二行)
第一部分不匹配,因为它在行尾之前和之后没有两个带字母的点,
(regex元字符)与行尾不匹配,除非(将?s
添加到regexp)。您的regexp以^开头,以$结尾,所以:这就像说“在行尾之前查找类似xxx.yyy.zzz的内容”更新:感谢您的评论
"test \r\n www.stackoverflow.com test"
变成“test\r”
(第一行)和“\n www.stackoverflow.com test”
(第二行)
第一部分不匹配,因为它在行尾前后没有两个带字母的点,
(regex元字符)与行尾不匹配,除非(将?s
添加到regexp)。这里可能有几个问题
首先,“.*”将不匹配换行符。其次,使用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
这里可能有几个问题 首先,“.*”将不匹配换行符。其次,使用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
您将无法匹配有效的主机名,并且无法将无效的主机名与此regexYes匹配,我看到了,但是我想知道为什么当字符串包含“\r\n”时模式会失败。问题出现在点和下一行字符上。您将无法匹配有效的主机名,并且无法将无效的主机名与此regexYes匹配,我看到了,但是我想知道为什么当字符串包含“\r\n”时模式会失败环包含“\r\n”。问题出现在点和下一行字符上。但他有。*s任一侧来匹配环任一侧的任何内容url@OGHaza我添加了解释:它与列表末尾不匹配,但您的其余答案不正确,除非设置了相应的标志
(?m)
,^$
匹配输入的开始和结束,而不是行。你是对的。我混淆了“^”表示“行的开始”和“$”表示“行的结束”的事实“关于点的问题。但是他有。*s任何一方都可以匹配任何一方的问题。”url@OGHaza我添加了解释:它与行尾不匹配,但您的其余答案不正确,除非设置了相应的标志(?m)
,^$
匹配输入的开始和结束,而不是行。您是对的。我把“^”表示“行的开始”和“$”表示“行的结束”这两个字与圆点问题混淆了。