web-dev-qa-db-ja.com

Javaで文字列の文字を置き換えるにはどうすればよいですか?

Javaを使用して、テキストの行を調べて、すべてのアンパサンド記号(&)をXMLエンティティ参照&に置き換えます。

テキストの行をスキャンし、テキスト内の各WordをScannerクラスでスキャンします。次に、CharacterIteratorを使用して、Wordの各文字を反復処理します。しかし、どうすればキャラクターを置き換えることができますか?まず、文字列は不変オブジェクトです。次に、文字(&)をいくつかの文字(amp&;)に置き換えます。これにどのようにアプローチすればよいですか?

CharacterIterator it = new StringCharacterIterator(token);
for(char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) {
       if(ch == '&') {

       }
}
62
user42155

代わりにString.replace()またはString.replaceAll()を使用してみてください。

String my_new_str = my_str.replace("&", "&");

(両方ともすべての出現を置き換えます。replaceAllは正規表現の使用を許可します。)

114
Amber

簡単な答えは:

token = token.replace("&", "&");

ReplaceAllと比較した名前にもかかわらず、replaceはreplaceAllを実行し、正規表現を使用しません。これはここにあるようです(パフォーマンスと優れた実践の観点から-誤って正規表現を使用しないでください)彼らはあなたが注意を払っていない特別なキャラクターの要件を持っているので)。

ショーン・ブライトの答えは、おそらくパフォーマンスの観点から考える価値がありますが、パフォーマンスとパフォーマンスのテストに関するさらなるターゲット要件がない場合、このコードがパフォーマンスのホットスポットであることを既に知っている場合、それがあなたの質問の出所である場合それは確かに下票に値するものではありません。同期が必要でない限り、StringBufferではなくStringBuilderを使用してください。

そうは言っても、ここにはやや深い潜在的な問題があります。文字のエスケープは、多くのライブラリが対処している既知の問題です。 XMLのCDATAセクションでデータをラップすることを検討するか、XMLライブラリ(現在JDKに付属しているライブラリを含む)を使用して実際にXMLを適切に生成することをお勧めします(エンコードを処理するため) )。

Apacheには、Commons Langの一部として エスケープライブラリ もあります。

88
Yishai
StringBuilder s = new StringBuilder(token.length());

CharacterIterator it = new StringCharacterIterator(token);
for (char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) {
    switch (ch) {
        case '&':
            s.append("&");
            break;
        case '<':
            s.append("&lt;");
            break;
        case '>':
            s.append("&gt;");
            break;
        default:
            s.append(ch);
            break;
    }
}

token = s.toString();
14
Sean Bright

また、既に置き換えられているオカレンスを置き換えないことを確認することもできます。これを行うには、負の先読みを使用した正規表現を使用できます。

例えば:

String str = "sdasdasa&amp;adas&dasdasa";  
str = str.replaceAll("&(?!amp;)", "&amp;");

これは、文字列「sdasdasa&amp;adas&amp;dasdasa」になります。

正規表現パターン「&(?! amp;)」は基本的に、「amp;」が後に続かない「&」の出現に一致します。

8
Robert Durgin

問題のデータをすべて含む文字列を作成し、次のように String.replaceAll() を使用します。

String result = yourString.replaceAll("&", "&amp;");
4
Taylor Leese

文字列のエスケープ 注意が必要な場合があります -特にUnicodeを考慮したい場合。 XMLは、エスケープするのにまだ簡単なフォーマット/言語の1つだと思います。 Apache Commons LangのStringEscapeUtilsクラスと、その便利な escapeXml メソッドを確認することをお勧めします。

1
Chris Vest

このコードを試してください。任意の文字を別の文字に置き換えることができます。ここでは、文字列'a'"-"の文字列に置き換えようとしました"abcdeaa"

OutPut-> _ bcdef __

    public class Replace {

    public static void replaceChar(String str,String target){
        String result = str.replaceAll(target, "_");
        System.out.println(result);
    }

    public static void main(String[] args) {
        replaceChar("abcdefaa","a");
    }

}
1
chamzz.dot

this メソッドをご覧ください。

0
IRBMe
//I think this will work, you don't have to replace on the even, it's just an example. 

 public void emphasize(String phrase, char ch)
    {
        char phraseArray[] = phrase.toCharArray(); 
        for(int i=0; i< phrase.length(); i++)
        {
            if(i%2==0)// even number
            {
                String value = Character.toString(phraseArray[i]); 
                value = value.replace(value,"*"); 
                phraseArray[i] = value.charAt(0);
            }
        }
    }
0
user2125311

Springを使用している場合は、HtmlUtils.htmlEscape(String input)を呼び出すだけで、 '&'から '&'への変換を処理できます。

0
Adamski