issues - Java: Reemplazar todo ''en una cadena con /'
jira rest api get all issues (5)
Necesito escapar de todas las comillas ('') en una cadena, para que se convierta en /'
He intentado usar replaceAll, pero no hace nada. Por alguna razón no puedo hacer que la expresión regular funcione.
Estoy tratando con
String s = "You''ll be totally awesome, I''m really terrible";
String shouldBecome = "You/'ll be totally awesome, I/'m really terrible";
s = s.replaceAll("''","//'"); // Doesn''t do anything
s = s.replaceAll("/'","//'"); // Doesn''t do anything
s = s.replaceAll("//'","//'"); // Doesn''t do anything
Estoy realmente atrapado aquí, espero que alguien pueda ayudarme aquí.
Gracias,
Iwan
Esto no dice cómo "solucionar" el problema; eso ya se ha hecho en otras respuestas; existe para extraer los detalles y referencias de documentación aplicables.
Al usar String.replaceAll
o cualquiera de los sustitutos de Matcher aplicables, preste atención a la cadena de reemplazo y cómo se maneja:
Tenga en cuenta que las barras diagonales invertidas (
/
) y los signos de dólar ($
) en la cadena de reemplazo pueden hacer que los resultados sean diferentes a los que se trataron como una cadena de reemplazo literal. Los signos de dólar pueden tratarse como referencias a subsecuencias capturadas como se describe anteriormente, y las barras invertidas se utilizan para escapar de caracteres literales en la cadena de reemplazo.
Como lo señala isnot2bad en un comentario, Matcher.quoteReplacement
puede ser útil aquí:
Devuelve una cadena de reemplazo literal para la cadena especificada. .. La cadena producida coincidirá con la secuencia de caracteres en s tratada como una secuencia literal. Las barras (
/
) y los signos de dólar ($
) no tendrán un significado especial.
Hagamos un recorrido por String # repalceAll (Regex de cadenas, reemplazo de cadenas)
Verás que:
Una invocación de este método de la forma str.replaceAll (regex, repl) produce exactamente el mismo resultado que la expresión
Pattern.compile(regex).matcher(str).replaceAll(repl)
Así que Matcher.html#replaceAll(java.lang.String) un vistazo a la documentación de Matcher.html#replaceAll(java.lang.String)
Tenga en cuenta que las barras diagonales invertidas (
/
) y los signos de dólar ($
) en la cadena de reemplazo pueden hacer que los resultados sean diferentes a los que se trataron como una cadena de reemplazo literal. Los signos de dólar pueden tratarse como referencias a subsecuencias capturadas como se describe anteriormente, y las barras invertidas se utilizan para escapar de caracteres literales en la cadena de reemplazo .
Puede ver que en replacement
tenemos un carácter especial $
que puede usarse como referencia a un grupo capturado como
System.out.println("aHellob,aWorldb".replaceAll("a(//w+?)b", "$1"));
// result Hello,World
Pero a veces no queremos que $
sea tan especial porque queremos usarlo como un simple personaje de dólar, por lo que necesitamos una forma de escapar de él.
Y aquí viene /
, porque como se usa para escapar de metacaracteres en expresiones regulares, cadenas y probablemente en otros lugares, es una buena convención usarlo aquí para escapar de $
.
Así que ahora también es un metacarácter en la parte de reemplazo, así que si quieres hacerlo simple en lugar de literal, debes escapar de alguna manera. ¿Y adivina qué? Se escapa de la misma forma que se escapa en expresiones regulares o String. Solo necesitas colocar otro /
antes de que te escape.
Por lo tanto, si desea crear una parte de reemplazo, debe agregar otra /
anterior. Pero recuerde que para escribir /
literal en String debe escribirlo como "//"
por lo que para crear dos //
en reemplazo debe escribirlo como "////"
.
Así que intenta
s = s.replaceAll("''", "////'");
O mejor
para reducir el escape explícito en la parte de reemplazo (y también en la parte de expresiones regulares: olvidé mencionar que anteriormente) simplemente use replace
lugar de replace
replaceAll
que agrega la expresión regular de escape para nosotros
s = s.replace("''", "//'");
Primero debes escapar de la barra invertida porque es un literal (que produce //
), y luego escapar de nuevo debido a la expresión regular (que produce ////
). Entonces, prueba:
s.replaceAll("''", "////'");
salida:
You/'ll be totally awesome, I/'m really terrible
También puedes intentar usar algo como StringEscapeUtils para hacer tu vida aún más fácil: http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringEscapeUtils.html
s = StringEscapeUtils.escapeJava(s);
Utilice replace()
s = s.replace("''", "//'");
salida:
Serás totalmente increíble, soy realmente terrible