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

时间:2012-09-17 10:17:19

标签: java regex

我有一个演示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'?

4 个答案:

答案 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>