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

投稿に正規表現を含める場合は、実際に使用しているときに、この場合はJava文字列リテラルとして正規表現を投稿することをお勧めします。

"[.\\s]"正規表現を表すJava文字列リテラル[.\s]です。リテラルドットまたは空白文字と一致します。他の人が言っているように、正規表現はバックスラッシュや「s」と一致させようとはしていませんが、重要な要素は.、文字クラス内での特別な意味を失うことです。

"(.|\\s)"正規表現を表すJava文字列リテラル(.|\s)です。一致します(行区切り文字または空白文字以外)。意図したとおりに動作しますが、使用しないでください。この回答で説明されているように、壊滅的なバックトラック に対して非常に脆弱なままになります。

しかし、心配する必要はありません。実際に行う必要があるのは、行区切り文字を含む.すべてのものと一致させることができるDOTALLモード(単一行モードとも呼ばれます)を使用することだけです。

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

ダニエルが言ったように、構文[.\\s]は意味をなさない.

[.\\s]をもっと単純なものに置き換えられないのはなぜ.ですか?

于 2012-09-17T10:22:35.683 に答える
0

上記の場合は+1。

私はするだろう:

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

内容に合わせてdl

于 2012-09-17T10:22:00.220 に答える