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を使用してドキュメントを解析し、結果のドキュメントを操作して、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

この正規表現を使用して、文字列をさまざまなグループに分割できます

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

最初の部分は特殊文字の前のテキストと一致し、2番目の部分は特殊文字と一致します。

それが済んだら、最初のグループのみを大文字に変換し、文字列のすべての一致に対して繰り返します。

于 2012-08-23T14:57:24.857 に答える
0

名前付きのすべてのエンティティを同等の数値に置き換えるという、正しい考えがあると思います。

HTML4のW3Cのエンティティのリストは次のとおりです。http://www.w3.org/TR/html4/sgml/entities.html

あまり手間をかけずに、それを1つの2列のテーブルにフォーマットできます。(そのリンクには3つのテーブルがあることに注意してください。)それを実行してから、テーブルを読み込んで、名前付きから数値に、またはその逆に簡単に変換できます。

于 2012-08-23T14:58:05.257 に答える