Primero, resumamos los usos de los tres:
・ Reemplace (objetivo de CharSECHENCE, reemplazo de caracteres) , reemplace todos los objetivos con reemplazo, ambos parámetros son cadenas.
・ ReplaceAll (String Regex, Reemplazo de cadenas) , reemplace todas las coincidencias de regex con reemplazo. Regex es obviamente una expresión regular, el reemplazo es una cadena.
・ ReemplazarFIRST (String Regex, Reemplazo de cadenas) , que es básicamente lo mismo que ReplaceAll, la diferencia es que solo se reemplaza la primera coincidencia.
A continuación, hay un requisito simple, que es reemplazar A en la cadena de origen con /A, el código es el siguiente:
System.out.println ("abac" .replace ("a", "// a")); ///ab/acsystem.out.println("ABac".replaceall(("a "," // a ")); //abacsystem.out.println("abac".replaceFirst("a "," // a ")); //abacsystem.out.println("abac".replaceFirst("a "," // a ")); // abacEl resultado fue una gran sorpresa. Después de tantos años de reemplazo, estaba un poco confundido.
La cadena de origen es "ABAC", y luego encontramos "A", reemplácela con /a. Dado que /es un personaje de escape de Java, si desea expresar /a, debe escribir "// a", la primera barra de inactividad escapa de la segunda barra de retroceso en una cadena normal.
Con tres expresiones de reemplazo, solo el resultado de la primera función de reemplazo es correcto. ¿Cuál es el problema?
ReplaceAll y Reemplazar para que el primer parámetro sea una expresión regular. "A" se puede entender como la cadena A y la expresión regular A, por lo que el primer parámetro está bien.
El problema radica en el segundo parámetro. Si los lectores leen cuidadosamente los comentarios de la función ReplaceAll, encontrarán la siguiente explicación:
Tenga en cuenta que las indias de retroceso (/) y los signos de dólar ($) en la cadena de reemplazo pueden hacer que los resultados sean diferentes a si se tratara como una cadena de reemplazo literal; Ver matcher.replaceall. Use java.util.regex.matcher.quoterePlausement para suprimir el significado especial de estos caracteres, si lo desea.
Dado que el primer parámetro de ReplaceAll y Reemplazo de First es regular, podemos hacer algunos pequeños trucos en el segundo parámetro, como un requisito: reemplace A en la cadena de origen con el carácter inmediatamente después de A, el código es el siguiente:
System.out.println ("ABAC" .replaceAll ("A (// W)", "$ 1 $ 1")); //bbccsystem.out.println("abac".replaceFirst("a(//w) "," $ 1 $ 1 ")); // bbacSuponga que el lector puede entender el significado de la regularidad, se puede ver que en el segundo parámetro, el símbolo $ se puede usar para obtener el contenido del grupo. En este ejemplo, se usan $ 1 para obtener el contenido del primer grupo, es decir, el personaje inmediatamente después de a.
Por lo tanto, el símbolo $ tiene un significado especial en el segundo parámetro, y escribirlo al azar causará un error:
System.out.println ("ABAC" .replaceAll ("a (// w)", "$")); // Excepción en el hilo "principal" java.lang.stringindexoUtofboundsexception: Índice de cadena fuera de rango: 1¿Qué pasa si solo quiero reemplazarlo con $? Esto requiere que escape de los personajes:
System.out.println ("ABAC" .replacealll ("A", "// $")); // $ B $ CEn este punto, los lectores pueden darse cuenta repentinamente de que la barra insegura también tiene un significado especial (escapado) en el segundo parámetro, por lo que si queremos expresar la barra invertida, debemos escapar de nuevo:
System.out.println ("ABAC" .replaceAll ("A", "//// a")); ///ab/acsystem.out.println("ABac".replaceFirst("a "," ///// a ")); /// ABACPara comprender brevemente, la barra de de fondo delantera en "//// A" escapa de la barra invertida después, de modo que la barra invertida después es una cadena normal. De esta manera, la cadena vista en la memoria Java es "// a". Al procesar, la función Reemplazo de reemplazo utiliza la barra de retroceso delantera para escapar de la barra inalcanzada para expresar que la barra inalcadora posterior es una cadena ordinaria, que no se usa para escapar de $, y la cadena final en la memoria es " /A", de modo que se pueda reemplazar con éxito con /a.
Resumir
El tema del escape está enredado. A través de este artículo, el autor espera que los lectores puedan permanecer despiertos cuando usen estas funciones en el futuro, tenga en cuenta los caracteres especiales en los parámetros y evite escribir bombas de tiempo. Lo anterior es todo el contenido de este artículo. Espero que sea útil para el estudio y el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse.