0

通常、文字列には xml タグがあります。しかし、HTML マークアップを含むタグができました。<hg>This is text</hg>文字列には、またはを含めることができます<html><![CDATA[<table>this is table</table>]]</html>。外側のタグのみを空の文字列に置き換えたい。したがって、最初のケースで<hg></hg>は空の文字列に置き換えられ、2 番目のケースでは空の文字列<html></html>に置き換えられます。外部 API を使用していますが、これには正規表現しか使用できませんか? 私は試した

String retVal = original.replace("`<.*?>.*</.*>`",""); but it didn't work.

編集:

結果を次のように生成したい<!CDATA[[<table>winter</table>]]> String original = "<html><![CDATA[[<table>winter</table>]]></html>" String retval = original.replaceAll("<([^>]*)>(?:[^<]|<!\[CDATA\[.*?]]>)*</\\1>", "");

4

5 に答える 5

1

同じタイプのネストされたタグがないと仮定すると、使用できます

String retVal = original.replaceAll(
    "(?s)<(\\w+)(?: [^>]*)?>(\\s*<!\\[CDATA\\[.*?\\]\\]>\\s*|.*?)</\\1>", "$2"
);

(?s)単一行モードをオンにするため.、改行文字にも一致します。
\\1によって一致したもの(\\w+)、つまりタグ名です。
$2タグ内のコンテンツです。

于 2013-04-12T16:28:02.753 に答える
0

タスクは正規表現には複雑すぎるようです。アルゴリズムのソリューションしか提供できません

    String s = "<hg>This is text</hg> or <html><![CDATA[<table>this is table</table>]]</html>.";
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i != -1;){
        i = s.indexOf("<![CDATA[", i);
        if (i != -1) {
            sb.append(s.substring(0, i).replaceAll("<.*?>", ""));
            int j = s.indexOf("]]");
            sb.append(s.substring(i + 9, j));
            s = s.substring(j + 2);
            i = 0;
        } 
    }
    sb.append(s.replaceAll("<.*?>", ""));
    System.out.println(sb);

出力

This is text or <table>this is table</table>.
于 2013-04-12T14:43:57.450 に答える
0

次の例は C# です。Java 用に変更します。

string result = Regex.Replace(input, @"<(\w+)>(.*)</\1>", "$2");
于 2013-04-12T17:50:55.003 に答える
0

試す:

String retVal = original.replace("<([^>]*)>([^<]|<!\\[CDATA\\[.*?]]>)*</\\1>","$2");

それでも、タグに属性がある場合、失敗します (ただし、変更して適応させることはできます)。

編集:
あなたの例に欠陥が見られなかったので編集しました。CDATA の末尾に ">" がありません。

于 2013-04-12T14:15:34.293 に答える
-1

「(?(?!])」

私があなたを理解し、あなたの例からreplaceAllメソッドを使用する場合、これはあなたが望むものと一致するはずです。

于 2013-04-12T19:40:33.867 に答える