如何解决replaceAll的replaceAll

时间:2013-02-06 11:59:23

标签: java search replaceall

我有点问题。 我有一个文本,我必须在浏览器中读几次。 每次,我打开这个文本,自动启动我写的replaceAll。 这很简单,基本但问题是,当我下次更换时(每次我读这篇文章)我都有一个replaceAll替换所有。 例如,我在文中有:

XIII

我想替换它

<b>XIII</b>

使用:

txt.replaceAll("XIII","<b>XIII</b>")

第一次一切都很好,但是当我再次阅读文本时,它变成了:

<b><b>XIII</b></b>

这是一个愚蠢的问题,但我现在从Java开始。 我读过可能正在使用正则表达式。有人可以发布一个小例子吗?

谢谢,请原谅我可怜的英语。

3 个答案:

答案 0 :(得分:3)

你需要负面的lookbehind来防止已经标记的字符串匹配:

txt.replaceAll("(?<!>)XIII","<b>XIII</b");

这个表达式看起来有点复杂,但这就是它分解的方式:

  • (?<! ... )是负面后卫的模板;
  • >是我们希望确保不会出现在字符串前面的特定字符。

我还应该警告你,用正则表达式修复HTML通常会变成升级正则表达式的另一个循环,以处理另一个特殊情况,只是看到它在下一个失败。它最终得到了一个没人能读的怪物,更不用说改进了。

答案 1 :(得分:1)

有一个非常快速的解决方案。在做自己的事情之前做相反的替换。

让我说明一下:

txt.replaceAll("<b>XIII</b>","XIII").replaceAll("XIII","<b>XIII</b>")

因此,您首先将<b>转为正常状态,然后使用<b>将其转回,并且在不添加<b>的新级别的情况下,它将获得相同的结果。

答案 2 :(得分:-1)

这个怎么样:

txt = txt.replaceAll ("XIII", "<b>XIII</b>").
    replceAll ("<b><b>", "<b>").replaceAll ("</b></b>", "</b>");

我认为<b><b></b></b>在HTML中没有多大意义,所以即使在其他地方也可以删除重复项。