0

入力:

<tag>Testing different formatting options in </tag><tag class="classA classB">Text</tag><tag class="classC">Class C text</tag>

期待される出力:

<tag>Testing different formatting options in </tag><tagA><tabB>Text</tagA></tagB><tagC>Class C text</tag>

基本的に、タグは「クラス」の属性に基づいたタグに置き換えられます。つまり、属性に classA 属性がある場合、タグは tagA に置き換えられ、classB 属性も存在する場合、タグには tagB も含まれます。

行われた試み:

    final String TAG_GROUPS = "<tag class=\"(.*)\">(.*)</tag>";
    Pattern pattern = Pattern.compile(TAG_GROUPS);
    Matcher matcher = pattern.matcher(inputString);

取得している出力で、一致するタグが見つかりません。特に声明は

    String classes = matcher.group(1);

文字列 を与えるclassA classB">Text</tag><tag class="classC">Class C text</tag。パターン マッチャーが一致するタグを見つけられません。私は正規表現の初心者で、問題の正しいパターンを知りたいです。どんな助けでも大歓迎です。

4

3 に答える 3

2

貪欲な正規表現を使用する必要があります: "<tag class=\"(.*?)\">(.*)</tag>". それ以外の場合は、 を含む任意の文字.*に一致します。</tag>

しかし、一般的に、これは正規表現を使用して XML を解析するベスト プラクティスではないことに同意します。代わりに XML パーサーを使用してください。

于 2013-01-16T17:03:47.983 に答える
1

あなたが使うとき、*それはすべての可能なキャラクターを吸収しようとします(貪欲)。

可能性の低い文字と一致させたい場合は.*、でレイジーマッチを使用する必要があります*?

したがって、正規表現は次のようになります。

<tag class=\"(.*?)\">(.*?)</tag>

上記は簡単な方法です。しかし、最適な方法である必要はありません。レイジーマッチは欲張りよりも遅いので、可能であれば、それを避けようとする必要があります。たとえば、コードが正しいと見積もる場合(閉じるタグなしでタグが壊れないなど)は、の代わりに否定クラスを使用する方が適切です.*?。たとえば、正規表現は次のように記述できます。

<tag class="([^"]*)">([^<]*)</tag>

魔女は正規表現エンジンにとってより効率的です(ただし、怠惰な一致を否定クラスに変換することが常に可能であるとは限りません)。

そしてもちろん、完全なhtmlまたはxmlドキュメントをwitchで解析しようとしている場合は、さまざまな変更を行う必要があります。xml(html)パーサーを使用することをお勧めします。

于 2013-01-16T17:14:45.370 に答える
1

正規表現を使用して開始タグを見つけてクラスを解析することはできますが、ネストされたタグを出力として生成する方法はありません。詳細については、この回答を参照してください。

できることは、独自の単純な HTML パーサーを作成することですが、HTML は解析するのがかなり面倒です。または、別の言い方をすれば、私の評判を見て、本当に正当な理由 (誰かが私に 50 万ドルを支払うなど) がなければ、はそれを試さないと考えてください。

代わりに、 HTML Tidyのような実際の HTML パーサーを使用してください。

于 2013-01-16T17:03:13.957 に答える