software issues issue example create all java regex string replaceall

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



Utilice replace()

s = s.replace("''", "//'");

salida:

Serás totalmente increíble, soy realmente terrible