早上好。我意识到有很多关于替换的问题,replaceAll()
但我没有看到这个。
我想做的是解析一个字符串(其中包含有效的html到一个点),然后在我看到<p>
字符串中的第二个实例之后,我想删除以 & 开头并以 ; 结尾的所有内容 直到我看到下一个</p>
为了做第二部分,我希望使用类似的东西s.replaceAll("&*;","")
这不起作用,但希望它能让我明白我正在寻找替换任何以 & 开头并以 ; 结尾的东西。
您可能应该将解析留给 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;
令牌,因此该&.*?;
版本可能会出现巨大的性能瓶颈。
你想要的表达式是:
s.replaceAll("&.*?;","");
但是你真的想以这种方式解析 HTML 吗?使用 XML 解析器可能会更好。