如何用单个子串替换连续出现的子串?

时间:2014-03-21 06:07:01

标签: java android regex string

我在android froom中解析了一个带有spannable字符串的html字符串。 : -

<p dir="ltr"><b><b><b><b><b>qwert</b></b></b></b></b><b><b><b><b><b><b>y</b></b></b></b></b></b></p>

如您所见,标签有多处出现。

现在我已经完成了点击和试用,用户方法如replaceAll(),但它们会替换所有出现的事件。

我想要的是,当我通过子字符串查找时,让我们说&#34; <b>&#34;,然后它应该替换,让我们说上面的前五个连续粗体标签一个&#34; <b>&#34;标签

任何建议

必填结果: - <p dir="ltr"><b>qwert</b><b>y</b></p>

2 个答案:

答案 0 :(得分:5)

如果我理解你的问题,你可以试试这个正则表达式:

(<[^>]+>)\\1+

并替换为:

\\1

在代码中......

String test = "<p dir=\"ltr\"><b><b><b><b><b>qwert</b></b></b></b></b><b><b><b><b><b><b>y</b></b></b></b></b></b></p>";
String out = test.replaceAll("(<[^>]+>)\\1+", "$1");

输出:

<p dir="ltr"><b>qwert</b><b>y</b></p>

(<[^>]+>)匹配并捕获第1组,它找到的第一个标记。

正则表达式中的

\\1指的是第一个捕获的标记。 +表示无限重复(嗯,限制是一个很大的数字,我认为你不必担心)。

替换$1然后也引用第一个捕获的标记。

ideone demo

答案 1 :(得分:2)

你想要这样的东西

查找:(<b>)\1+|(<\/b>)\2+

替换:\1\2

演示: http://regex101.com/r/aC6iP4