Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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正则表达式为什么这两个正则表达式不同_Java_Regex - Fatal编程技术网

java正则表达式为什么这两个正则表达式不同

java正则表达式为什么这两个正则表达式不同,java,regex,Java,Regex,我有一个java字符串演示了一个div元素: String source = "<div class = \"ads\">\n" + "\t<dl style = \"font-size:14px; color:blue;\">\n" + "\t\t<li>\n" + "\t\t\t<a href = \"http://ggicci.blog.163.com\

我有一个java字符串演示了一个div元素:

String source = "<div class = \"ads\">\n" +
                "\t<dl style = \"font-size:14px; color:blue;\">\n" +
                "\t\t<li>\n" +
                "\t\t\t<a href = \"http://ggicci.blog.163.com\" target = \"_blank\">Ggicci's Blog</a>\n" +
                "\t\t</li>\n" +
                "\t</dl>\n" +
                "</div>\n";

那么为什么“.”不能与“a”匹配呢?

在方括号内,字符被视为文字<代码>[.\\s]表示“匹配点、反斜杠或s”


(.|\\s)
相当于


我认为您确实需要以下正则表达式:

<dl[^>]*>.*?</div>
]*>.*?

在方括号内,字符按文字处理<代码>[.\\s]表示“匹配点、反斜杠或s”


(.|\\s)
相当于


我认为您确实需要以下正则表达式:

<dl[^>]*>.*?</div>
]*>.*?
+1用于上述内容

我会:

<dl[^>]*>(.*?)</dl>
]*>(**?)
以匹配上面的
dl

+1的内容

我会:

<dl[^>]*>(.*?)</dl>
]*>(**?)

为了匹配
dl

的内容,语法
[.\\s]
毫无意义,因为正如Daniel所说,
在本文中仅表示“一个点”


为什么你不能用更简单的
替换你的
[.\\s]

语法
[.\\s]
毫无意义,因为,丹尼尔说,
在这个上下文中只意味着“一个点”


为什么不能用更简单的
替换
[.\\s]

当您在post中包含正则表达式时,最好在实际使用时发布它们——在本例中,作为Java字符串文本

“[.\\s]”
是一个Java字符串文字,表示正则表达式
[.\s]
;它匹配文字点或空白字符。您的正则表达式并不像其他人所说的那样试图匹配反斜杠或“s”,但关键因素是
在字符类中失去了其特殊意义

“(.|\\s)”
是一个Java字符串文字,表示正则表达式
(.|\s)
;它匹配(除行分隔符或任何空白字符外的任何字符)。它可以按您的预期工作,但不要使用它它使您极易受到攻击,如中所述

但不用担心,您真正需要做的就是使用DOTALL模式(也称为单行模式),它允许
匹配任何内容,包括行分隔符字符

(?s)<dl\b[^>]*>.*?</dl>
(?s)]*>*?

当您在post中包含正则表达式时,最好在实际使用它们时发布它们——在本例中,将它们作为Java字符串文本发布

“[.\\s]”
是一个Java字符串文字,表示正则表达式
[.\s]
;它匹配文字点或空白字符。您的正则表达式并不像其他人所说的那样试图匹配反斜杠或“s”,但关键因素是
在字符类中失去了其特殊意义

“(.|\\s)”
是一个Java字符串文字,表示正则表达式
(.|\s)
;它匹配(除行分隔符或任何空白字符外的任何字符)。它可以按您的预期工作,但不要使用它它使您极易受到攻击,如中所述

但不用担心,您真正需要做的就是使用DOTALL模式(也称为单行模式),它允许
匹配任何内容,包括行分隔符字符

(?s)<dl\b[^>]*>.*?</dl>
(?s)]*>*?

但是。无法匹配\n,如果和之间的内容包含\n或\r,它将无法正常工作。但是。无法匹配\n,如果和之间的内容包含\n或\r,它将无法正常工作。谢谢:)现在我了解了有关灾难性回溯的更多信息。因为我的阅读能力很差,所以很难理解这个机制。但我正在尽我最大的努力…谢谢:)现在我对灾难性回溯了解更多了。因为我的阅读能力很差,所以很难理解这个机制。但是我正在尽我最大的努力。。。
(?s)<dl\b[^>]*>.*?</dl>