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 == '&') {
}
}
代わりにString.replace()
またはString.replaceAll()
を使用してみてください。
String my_new_str = my_str.replace("&", "&");
(両方ともすべての出現を置き換えます。replaceAll
は正規表現の使用を許可します。)
簡単な答えは:
token = token.replace("&", "&");
ReplaceAllと比較した名前にもかかわらず、replaceはreplaceAllを実行し、正規表現を使用しません。これはここにあるようです(パフォーマンスと優れた実践の観点から-誤って正規表現を使用しないでください)彼らはあなたが注意を払っていない特別なキャラクターの要件を持っているので)。
ショーン・ブライトの答えは、おそらくパフォーマンスの観点から考える価値がありますが、パフォーマンスとパフォーマンスのテストに関するさらなるターゲット要件がない場合、このコードがパフォーマンスのホットスポットであることを既に知っている場合、それがあなたの質問の出所である場合それは確かに下票に値するものではありません。同期が必要でない限り、StringBufferではなくStringBuilderを使用してください。
そうは言っても、ここにはやや深い潜在的な問題があります。文字のエスケープは、多くのライブラリが対処している既知の問題です。 XMLのCDATAセクションでデータをラップすることを検討するか、XMLライブラリ(現在JDKに付属しているライブラリを含む)を使用して実際にXMLを適切に生成することをお勧めします(エンコードを処理するため) )。
Apacheには、Commons Langの一部として エスケープライブラリ もあります。
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("<");
break;
case '>':
s.append(">");
break;
default:
s.append(ch);
break;
}
}
token = s.toString();
また、既に置き換えられているオカレンスを置き換えないことを確認することもできます。これを行うには、負の先読みを使用した正規表現を使用できます。
例えば:
String str = "sdasdasa&adas&dasdasa";
str = str.replaceAll("&(?!amp;)", "&");
これは、文字列「sdasdasa&adas&dasdasa
」になります。
正規表現パターン「&(?! amp;)」は基本的に、「amp;」が後に続かない「&」の出現に一致します。
問題のデータをすべて含む文字列を作成し、次のように String.replaceAll() を使用します。
String result = yourString.replaceAll("&", "&");
文字列のエスケープ 注意が必要な場合があります -特にUnicodeを考慮したい場合。 XMLは、エスケープするのにまだ簡単なフォーマット/言語の1つだと思います。 Apache Commons LangのStringEscapeUtilsクラスと、その便利な escapeXml メソッドを確認することをお勧めします。
このコードを試してください。任意の文字を別の文字に置き換えることができます。ここでは、文字列'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");
}
}
this メソッドをご覧ください。
//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);
}
}
}
Springを使用している場合は、HtmlUtils.htmlEscape(String input)
を呼び出すだけで、 '&'から '&'への変換を処理できます。