如何将字符串转换为大写String.toUpperCase(),忽略
等特殊字符以及所有其他字符。问题在于它变成了 并且浏览器不会将它们识别为特殊的HTML字符。
我想出了这个,但它没有涵盖所有特殊字符:
public static String toUpperCaseIgnoreHtmlSymbols(String str){
if(str == null) return "";
str = str.trim();
str = str.replaceAll("(?i) "," ");
str = str.replaceAll(""",""");
str = str.replaceAll("&","&");
//etc.
str = str.toUpperCase();
return str;
}
答案 0 :(得分:3)
您是否只对跳过HTML实体感兴趣,还是想跳过标签?那些javascript块怎么样?链接中的URL?
如果你需要支持那种东西,你将无法避免使用“真正的”HTML解析器而不是正则表达式。例如,使用jsoup解析文档,操作生成的Document,并将其转换回HTML:
private String upperCase(String str) {
Document document = Jsoup.parse(str);
upperCase(document.body());
return document.html();
}
private void upperCase(Node node) {
if (node instanceof TextNode) {
TextNode textnode = (TextNode) node;
textnode.text(textnode.text().toUpperCase());
}
for (Node child : node.childNodes()) {
upperCase(child);
}
}
现在:
upperCase("This is some <a href=\"http://arnout.engelen.eu\">text with entities</a>");
将产生:
<html>
<head></head>
<body>
THIS IS SOME
<a href="http://arnout.engelen.eu">TEXT WITH ENTITIES</a>
</body>
</html>
答案 1 :(得分:0)
您可以使用此正则表达式将字符串拆分为不同的组
(.+?)(&[^ ]+?;)
第一部分匹配特殊字符前的文本,第二部分匹配特殊字符。
完成后,您只能将第一组转换为大写,重复该字符串的所有匹配。
答案 2 :(得分:0)
我认为你有正确的想法,用他们的数字等价替换所有命名的实体。
以下是W3C的HTML4实体列表:http://www.w3.org/TR/html4/sgml/entities.html
您可以将其格式化为单个双列表而无需太多工作。 (请注意,该链接有三个表。)我会这样做,然后读取表格,您可以轻松地从命名转换为数字并返回。