我有一个演示div元素的java字符串:
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";
以html格式表示:
<div class = "ads">
<dl style = "font-size:14px; color:blue;">
<li>
<a href = "http://ggicci.blog.163.com" target = "_blank">Ggicci's Blog</a>
</li>
</dl>
</div>
我写这样一个正则表达式来提取dl元素:
<dl[.\\s]*?>[.\\s]*?</div>
但它什么也没找到,我把它修改为:
<dl(.|\\s)*?>(.|\\s)*?</div>
然后它的工作原理。所以我测试了这样:
System.out.println(Pattern.matches("[.\\s]", "a")); --> false
System.out.println(Pattern.matches("[abc\\s]", "a")); --> true
为什么'。'不能匹配'a'?
答案 0 :(得分:3)
在方括号内,字符处理文字。 [.\\s]
表示“匹配点,或反斜杠或s”。
(.|\\s)
相当于.
。
我认为你真的想要以下正则表达式:
<dl[^>]*>.*?</div>
答案 1 :(得分:0)
+1以上。
我愿意:
<dl[^>]*>(.*?)</dl>
匹配dl
答案 2 :(得分:0)
语法[.\\s]
毫无意义,因为和丹尼尔说,.
在这种情况下只是意味着“一个点”。
为什么不能用更简单的[.\\s]
替换.
?
答案 3 :(得分:0)
当你在帖子中包含正则表达式时,最好在你实际使用它们时发布它们 - 在这种情况下,作为Java字符串文字。
"[.\\s]"
是表示正则表达式[.\s]
的Java字符串文字;它匹配文字点或空格字符。正如其他人所说,你的正则表达式不是试图匹配反斜杠或's',但关键因素是.
在字符类中失去了它的特殊含义。
"(.|\\s)"
是表示正则表达式(.|\s)
的Java字符串文字;它匹配(除了行分隔符或任何空格字符之外的任何内容)。它按预期工作,但不使用它!它使您极易受catastrophic backtracking的影响,如this answer中所述。
但不用担心,您真正需要做的就是使用DOTALL模式(也称为单行模式),这使.
能够匹配任何包括行分隔符。< / p>
(?s)<dl\b[^>]*>.*?</dl>