Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式检查包含web地址的字符串_Java_Regex - Fatal编程技术网

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)
^$
匹配输入的开始和结束,而不是行。您是对的。我把“^”表示“行的开始”和“$”表示“行的结束”这两个字与圆点问题混淆了。