una - manejo de cadenas en java
¿Cómo reemplazo un carácter en una cadena en Java? (10)
Utilizando Java, quiero ir a través de las líneas de un texto y reemplazar todos los símbolos &
símbolos ( &
) con la referencia de entidad XML &
.
Escaneo las líneas del texto y luego cada palabra en el texto con la clase Escáner. Luego uso el CharacterIterator
para iterar sobre cada uno de los caracteres de la palabra. Sin embargo, ¿cómo puedo reemplazar el personaje? Primero, las cadenas son objetos inmutables. En segundo lugar, quiero reemplazar un personaje ( &
) con varios caracteres ( amp&;
). ¿Cómo debería abordar esto?
CharacterIterator it = new StringCharacterIterator(token);
for(char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) {
if(ch == ''&'') {
}
}
Eche un vistazo a String.replaceAll() método.
Escapar cadenas puede ser complicado , especialmente si desea tomar en cuenta unicode. Supongo que XML es uno de los formatos / lenguajes más simples para escapar, pero aún así. Recomiendo echar un vistazo a la clase StringEscapeUtils en Apache Commons Lang, y su práctico método escapeXml .
Intenta usar String.replace()
o String.replaceAll()
lugar.
String my_new_str = my_str.replace("&", "&");
(Ambos reemplazan todas las ocurrencias; replaceAll
permite el uso de replaceAll
regulares).
La respuesta simple es:
token = token.replace("&", "&");
A pesar del nombre en comparación con replaceAll, replace hace un replaceAll, simplemente no usa una expresión regular, que parece estar en orden aquí (tanto desde el punto de vista del desempeño como desde la perspectiva de las buenas prácticas; no use expresiones regulares por accidente). ya que tienen requisitos especiales de carácter a los que no prestarás atención).
La respuesta de Sean Bright es probablemente tan buena como vale la pena pensar desde una perspectiva de rendimiento sin algún requisito adicional sobre el rendimiento y las pruebas de rendimiento, si ya sabes que este código es un punto caliente para el rendimiento, si de ahí viene tu pregunta. Ciertamente no se merece los votos a la baja. Simplemente use StringBuilder en lugar de StringBuffer a menos que necesite la sincronización.
Dicho esto, hay un problema potencial algo más profundo aquí. El escaparse de los caracteres es un problema conocido al que se dirigen muchas bibliotecas. Es posible que desee considerar envolver los datos en una sección CDATA en el XML, o puede preferir utilizar una biblioteca XML (incluida la que viene con el JDK ahora) para generar el XML correctamente (para que maneje la codificación). )
Apache también tiene una biblioteca de escape como parte de Commons Lang.
Pruebe este código. Puede reemplazar cualquier personaje con otro personaje dado. Aquí traté de reemplazar la letra ''a'' por el carácter "-" por la cadena "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");
}
}
Si está usando Spring, simplemente puede llamar a HtmlUtils.htmlEscape(String input)
que manejará la traducción ''&'' a ''&''.
Simplemente crea una cadena que contenga todos los datos en cuestión y luego usa String.replaceAll() como a continuación.
String result = yourString.replaceAll("&", "&");
También es posible que desee comprobar para asegurarse de que no reemplaza una ocurrencia que ya ha sido reemplazada. Puedes usar una expresión regular con lookahead negativo para hacer esto.
Por ejemplo:
String str = "sdasdasa&adas&dasdasa";
str = str.replaceAll("&(?!amp;)", "&");
Esto daría como resultado la cadena "sdasdasa & adas & dasdasa".
El patrón de expresión regular "& (?! amp;)" básicamente dice: Coincide con cualquier aparición de ''&'' que no esté seguido de ''amp;''.
//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);
}
}
}
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();