正则表达式删除多个html嵌套标签

时间:2014-10-16 11:08:44

标签: java html regex formatting

我有html sting:

<p dir="ltr">hello boys <b><b><b><b><b><b><b><b><b>n</b></b></b></b></b></b></b></b></b><b><b><b><b><b><b><b><b>o</b></b></b></b></b></b></b></b><b><b><b><b><b><b><b>w</b></b></b></b></b></b></b><b><b><b><b><b><b> </b></b></b></b></b></b><b><b><b><b><b>b</b></b></b></b></b><b><b><b><b>o</b></b></b></b><b><b><b>l</b></b></b><b><b>d</b></b><b> </b></p>

我想保留<p dir="ltr">标记,其中一个<b></b>包含所有单个粗体字符。

结果应为:

<p dir="ltr">hello boys <b>now bold</b></p>

<b></b>的数量不会被修复

在Java中可以遵循什么正则表达式来执行相同的操作。除了粗体

之外,还会出现斜体和下划线

如果,文本有三种类型的格式说明,粗体,斜体和下划线,生成的html是:

<p dir="ltr"><b><b><b><b>bold</b></b></b></b> <i><i><i><i><i><i><i><i>italic</i></i></i></i></i></i></i></i><i> </i>normal <u><u><u><u><u><u><u><u>underline</u></u></u></u></u></u></u></u> <b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b>all</b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b> </b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><b><i><u><u><b>together</b></u></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></u></i></b></p>

在应用了traianus建议的正则表达式之后,它的输出变为(我已经应用了粗体,斜体和下划线的格式):

<p dir="ltr"><b>bold</b> <i>italic</i> normal <u>underline all together</u></p>

因此,一起划线应该将b,i和u标记在一起,以便显示正确的格式。

代码:

String htmlString=Html.toHtml(mainEditText.getText());
        String boldRemoval = htmlString.replaceAll("<b>([a-z]*)</b>", "#$1#").replaceAll("(<b>|</b>)", "").replaceAll("#(.*)#", "<b>$1</b>").replaceAll("#", "");
        String italicRemoval = boldRemoval.replaceAll("<i>([a-z]*)</i>", "#$1#").replaceAll("(<i>|</i>)", "").replaceAll("#(.*)#", "<i>$1</i>").replaceAll("#", "");
        String underlineRemoval = italicRemoval.replaceAll("<u>([a-z]*)</u>", "#$1#").replaceAll("(<u>|</u>)", "").replaceAll("#(.*)#", "<u>$1</u>").replaceAll("#", "");
        Log.d("solution", underlineRemoval);

3 个答案:

答案 0 :(得分:2)

如果你放松你的问题以允许多轮替换(如Casimir所说),并且假设输入中不允许#字符,这样的事情可能会有所帮助:

String test = "<p dir=\"ltr\">hello boys <b><b><b><b><b><b><b><b><b>n</b></b></b></b></b></b></b></b></b><b><b><b><b><b><b><b><b>o</b></b></b></b></b></b></b></b><b><b><b><b><b><b><b>w</b></b></b></b></b></b></b><b><b><b><b><b><b> </b></b></b></b></b></b><b><b><b><b><b>b</b></b></b></b></b><b><b><b><b>o</b></b></b></b><b><b><b>l</b></b></b><b><b>d</b></b><b> </b></p>";

String solution = test.replaceAll("<b>([a-z]*)</b>", "#$1#").replaceAll("(<b>|</b>)", "").replaceAll("#(.*)#", "<b>$1</b>").replaceAll("#", ""));

答案 1 :(得分:1)

s = s.replaceAll("(</?(?:b|i|u)>)\\1+", "$1").replaceAll("</(b|i|u)><\\1>", "");

答案 2 :(得分:0)

 String s = "<p dir=\"ltr\">hello boys <b><b><b><b><b><b><b><b><b>n</b></b></b></b></b></b></b></b></b><b><b><b><b><b><b><b><b>o</b></b></b></b></b></b></b></b><b><b><b><b><b><b><b>w</b></b></b></b></b></b></b><b><b><b><b><b><b> </b></b></b></b></b></b><b><b><b><b><b>b</b></b></b></b></b><b><b><b><b>o</b></b></b></b><b><b><b>l</b></b></b><b><b>d</b></b><b> </b></p>";
    while (!s.equals(s = s.replaceAll("<b><b>([^<>]+)</b></b>", "<b>$1</b>"))) {
    }
    System.out.println(s.replaceAll("</b><b>", ""));