我有点问题。 我有一个文本,我必须在浏览器中读几次。 每次,我打开这个文本,自动启动我写的replaceAll。 这很简单,基本但问题是,当我下次更换时(每次我读这篇文章)我都有一个replaceAll替换所有。 例如,我在文中有:
XIII
我想替换它
<b>XIII</b>
使用:
txt.replaceAll("XIII","<b>XIII</b>")
第一次一切都很好,但是当我再次阅读文本时,它变成了:
<b><b>XIII</b></b>
这是一个愚蠢的问题,但我现在从Java开始。 我读过可能正在使用正则表达式。有人可以发布一个小例子吗?
谢谢,请原谅我可怜的英语。
答案 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中没有多大意义,所以即使在其他地方也可以删除重复项。