0

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

4 回答 4

3

在方括号内,字符按字面意思处理。[.\\s]意思是“匹配一个点、一个反斜杠或一个 s”。


(.|\\s)相当于.


我认为您真的想要以下正则表达式:

<dl[^>]*>.*?</div>
于 2012-09-17T10:19:01.350 回答
0

+1 以上。

我会做:

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

为了匹配内容dl

于 2012-09-17T10:22:00.220 回答
0

语法[.\\s]没有意义,因为正如丹尼尔所说,.在这种情况下,just 的意思是“一个点”。

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

于 2012-09-17T10:22:35.683 回答
0

当您在帖子中包含正则表达式时,最好在您实际使用它们时发布它们——在这种情况下,作为 Java 字符串文字。

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

"(.|\\s)"是表示正则表达式的 Java 字符串文字(.|\s);它匹配(除行分隔符任何空白字符之外的任何内容)。它可以按您的预期工作,但不要使用它!本答案所述, 它使您极易受到灾难性回溯的影响。

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

(?s)<dl\b[^>]*>.*?</dl>
于 2012-09-17T17:29:21.277 回答