2

クラスの正規表現パターンを学習しようとしています。私は単純な HTML レクサー/パーサーを作成しています。これがレクサー/パーサーを作成する最良または最も効率的な方法ではないことはわかっていますが、正規表現パターンを理解するためだけのものです。

私の質問は、文字列に HTML タグが含まれていないか (つまり<TAG>)、HTML エンティティが含まれていないか(つまり ) をチェックするパターンを作成するにはどうすればよい&ENT;ですか?

これは私がこれまでに思いついたものですが、まだ機能しません:

.+?(^(?:&[A-Za-z0-9#]+;)^(?:<.*?>))

編集: 唯一の問題は、きれいではないかもしれませんが、可能であればこのタスクを達成する完全なパターンを見つける必要がある最終結果を否定できないことです。言及したことはありませんが、HTML ページの任意の単純なテキストに一致するはずです。

4

2 に答える 2

2

<.+?>|&.+?;を使用して一致を検索し、結果を否定することができます。

  • <.+?>最初に a と言い、<次に何でも (1 回以上)、次に a>
  • &.+?;最初に a と言い、&次に何でも (1 回以上)、次に a;

ideone.com デモの完全な例をここに示します。

import java.util.regex.*;

public class Test {
    public static void main(String[] args) {
        String[] tests = { "hello", "hello <b>world</b>!", "Hello&nbsp;world" };
        Pattern p = Pattern.compile("<.+?>|&.+?;");
        for (String test : tests) {
            Matcher m = p.matcher(test);
            if (m.find())
                System.out.printf("\"%s\" has HTML: %s%n", test, m.group());
            else
                System.out.printf("\"%s\" does have no HTML%n", test);
        }
    }
}

出力:

"hello" does have no HTML
"hello <b>world</b>!" has HTML: <b>
"Hello&nbsp;world" has HTML: &nbsp;
于 2010-12-10T20:34:19.773 に答える
1

パターンに従わない文字列を照合する場合、最も簡単な方法は、パターンを照合してから、テストの結果を否定することです。

<[^>]+>|&[^;]+;

このパターンに一致する文字列には、少なくとも 1 つのタグ (定義したとおり) またはエンティティ (定義したとおり) があります。したがって、必要な文字列は、このパターンに一致しない文字列です (タグやエンティティはありません)。

于 2010-12-10T20:29:26.983 に答える