1

如何将字符串转换为大写 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;
}
4

3 回答 3

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&nbsp;with&nbsp;entities</a>");

将产生:

<html>
  <head></head>
  <body>
    THIS IS SOME 
    <a href="http://arnout.engelen.eu">TEXT&nbsp;WITH&nbsp;ENTITIES</a>
  </body>
</html>
于 2012-08-23T14:59:27.407 回答
0

您可以使用此正则表达式将字符串拆分为不同的组

(.+?)(&[^ ]+?;)

第一部分匹配特殊字符之前的文本,第二部分匹配特殊字符。

完成后,您可以仅将第一组转换为大写,重复字符串的所有匹配项。

于 2012-08-23T14:57:24.857 回答
0

我认为您的想法是正确的,将所有命名实体替换为其数字等价物。

这是 W3C 的 HTML4 实体列表:http: //www.w3.org/TR/html4/sgml/entities.html

您可以将其格式化为一个包含两列的表格,而无需太多工作。(请注意,该链接上有三个表格。)我会这样做,然后读入表格,您可以轻松地从命名转换为数字并返回。

于 2012-08-23T14:58:05.257 回答