4

早上好。我意识到有很多关于替换的问题,replaceAll()但我没有看到这个。

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

为了做第二部分,我希望使用类似的东西s.replaceAll("&*;","")

这不起作用,但希望它能让我明白我正在寻找替换任何以 & 开头并以 ; 结尾的东西。

4

2 回答 2

9

您可能应该将解析留给 DOM 解析器(请参阅此问题)。我几乎可以保证您必须这样做才能在<p>标签中查找文本。

对于替换逻辑,String.replaceAll使用正则表达式,可以做你想要的匹配。

您想要的正则表达式中的“通配符”就是.*表达式。使用您的示例:

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

这输出This String. 这是因为.代表任何字符,*意思是“这个字符 0 次或多次”。所以.*基本上意味着“任意数量的字符”。但是,喂它:

"This &escape;String &anotherescape;Extended"

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

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

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

于 2012-09-11T20:13:08.873 回答
1

你想要的表达式是:

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

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

于 2012-09-11T20:03:28.510 回答