【问题标题】:How to replace a continuous occurrence of a substring with a single substring?如何用单个子字符串替换连续出现的子字符串?
【发布时间】:2014-03-21 06:07:00
【问题描述】:

我有一个在 android 中解析的 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() 这样的用户方法,但它们替换了所有出现。

我想要的是,当我传递一个子字符串来查找时,让我们说“&lt;b&gt;”,然后它应该替换,让我们说上面字符串中的前五个连续的粗体标签用一个“&lt;b&gt; "标签。

任何建议

所需结果:- &lt;p dir="ltr"&gt;&lt;b&gt;qwert&lt;/b&gt;&lt;b&gt;y&lt;/b&gt;&lt;/p&gt;

【问题讨论】:

  • 链接无效。我对 android 到 html 解析没有任何问题。只是我想处理上面的字符串并删除重复项
  • 您希望从样本输入中得到什么输出?您当前使用的正则表达式是什么?
  • 我对 Matcher 类不熟悉。请看我的编辑。我已经更新了我的问题
  • 为什么在 qwert 之后有两个

标签: java android regex string


【解决方案1】:

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

(<[^>]+>)\\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>

(&lt;[^&gt;]+&gt;) 匹配并捕获第 1 组,即它找到的第一个标签。

正则表达式中的

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

替换的$1 也指第一个捕获的标签。

ideone demo

【讨论】:

  • 我是这个模式的新手。您的代码在上面运行良好。你能解释一下上述模式中的过程和所有方括号的含义吗
  • 好的,&lt;&gt; 表示这些符号本身。 [^&gt;]+ 是一个字符类。它表示除&gt; 之外的任何字符,至少重复一次。如果我有[^a]+,那就意味着除了a 之外的任何字符,至少重复一次。这有帮助吗?你还有什么想问的吗?
  • 是的。谢谢,如果我的字符串有这个:-&lt;b&gt;&lt;i&gt;&lt;b&gt;&lt;i&gt;&lt;b&gt;。我可以模式匹配替代“”并替换它们吗?
  • @RahulGupta 这可能是个问题...(如果可行),将使您的示例输入变为:&lt;p dir="ltr"&gt;&lt;b&gt;qwert&lt;/b&gt;y&lt;/p&gt;,我不确定这是您想要的。
【解决方案2】:

你想要这样的东西

查找:(&lt;b&gt;)\1+|(&lt;\/b&gt;)\2+

替换:\1\2

在这里演示: http://regex101.com/r/aC6iP4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-31
    • 2013-07-10
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 2015-11-09
    相关资源
    最近更新 更多