是否可以将replaceAll()与通配符一起使用

时间:2012-09-11 19:54:59

标签: java html string

早上好。我意识到有很多关于替换和replaceAll()的问题,但我已经看到了这一点。

我想要做的是解析一个字符串(其中包含有效的html到点)然后在我看到字符串中<p>的第二个实例后,我想要删除以&amp;开头的所有内容。结束于;直到我看到下一个</p>

要做第二部分,我希望使用s.replaceAll("&*;","")

的内容

这不起作用,但希望它得到我的观点,我正在寻找替换任何以&amp;开头的东西以...结束;

2 个答案:

答案 0 :(得分:8)

您应该将解析留给DOM解析器(see this question)。我几乎可以保证您必须这样做才能在<p>代码中查找文字。

对于替换逻辑,String.replaceAll使用正则表达式,可以进行所需的匹配。

&#34;通配符&#34;在您需要的正则表达式中是.*表达式。使用您的示例:

String ampStr = "This &escape;String";
String removed = ampStr.replaceAll("&.*;", "");
System.out.println(removed);

这会输出This String。这是因为.表示任何字符,*表示&#34;此字符为0或更多次。&#34;所以.*基本上意味着&#34;任意数量的字符。&#34;然而,喂它:

"This &escape;String &anotherescape;Extended"

可能不会做你想要的,它会输出This Extended。要解决此问题,请准确指定要查找的内容而不是.字符。这是使用[^;]完成的,这意味着&#34;任何分号的字符:

String removed = ampStr.replaceAll("&[^;]*;", "");

对于不匹配的字符串,这比&.*?;具有性能优势,因此我强烈建议您使用此版本,尤其是因为并非所有HTML文件都包含&abc;令牌和&.*?;版本因此可以拥有巨大的性能瓶颈。

答案 1 :(得分:1)

你想要的表达是:

s.replaceAll("&.*?;","");

但是你真的想以这种方式解析HTML吗?你可能最好使用XML解析器。