2010-09-09 19 views

Respuesta

209

Si desea que el punto u otros caracteres con un significado especial en expresiones regulares sea un carácter normal, debe escapar con una barra invertida. Dado que las expresiones regulares en Java son cadenas de Java normales, debe escapar de la barra invertida en sí, por lo que necesita dos barras diagonales inversas, p. \\.

expresiones
+1

esta corrección también se aplica a bash – krivar

+11

Tenga en cuenta que si se salta la barra diagonal inversa depende de cómo se está suministrando la expresión regular. si está codificado, necesita usar: "\\". Si lee desde una fuente sin formato (por ejemplo, un archivo de texto), usa solo una barra invertida: \. – Paul

4

Escape de los caracteres especiales con una barra diagonal inversa. \., \*, \+, \\d, y así sucesivamente. Si no está seguro, puede escapar de cualquier carácter no alfabético, ya sea que sea especial o no. Ver the javadoc for java.util.regex.Pattern para más información.

+0

Escapar personajes innecesarios podría funcionar en algunos idiomas pero podría fallar en otros, así que es mejor no entrar en el hábito. –

+1

Esta pregunta es específicamente sobre Java, y http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#bs dice "Se puede utilizar una barra invertida antes de una no - personaje alfabético independientemente de si ese personaje es parte de una construcción no escamada ". –

14

Perl estilo regulares (que el motor de expresiones regulares Java está más o menos basada en) el tratamiento de los siguientes caracteres como caracteres especiales:

.^$|*+?()[{\ tienen un significado especial fuera de clases de personajes,

]^-\ tiene un significado especial dentro de de clases de caracteres ([...]).

Así que debe escapar de esos (y solo esos) símbolos según el contexto (o, en el caso de las clases de caracteres, colóquelos en posiciones donde no se puedan malinterpretar).

Escapar innecesariamente de otros caracteres puede funcionar, pero algunos motores de expresiones regulares lo tratarán como errores de sintaxis, por ejemplo \_ causará un error en .NET.

Algunos otros darán lugar a resultados falsos, por ejemplo \< se interpreta como un literal < en Perl, pero en egrep significa "límite de palabra".

Así que escribe -?\d+\.\d+\$ para que coincida con 1.50$, etc. -2.00$ y [(){}[\]] para una clase de caracteres que coincida con todo tipo de abrazaderas/abrazaderas/paréntesis.

Si necesita transformar una cadena de entrada de usuario en una forma segura para expresiones regulares, use java.util.regex.Pattern.quote.

Más información: Jan Goyvaert's blog RegexGuru on escaping metacharacters

1

quería para que coincida con una cadena que termina con Para esto tuve que utilizar el siguiente "*.":

"^.*\\.\\*$" 

un poco tonto si se piensa en ello: D Esto es lo que significa. Al comienzo de la cadena, puede haber cualquier carácter cero o más seguido de un punto "." seguido de una estrella (*) al final de la cadena.

Espero que esto sea útil para alguien. Gracias por la barra invertida a Fabian.

12

Las soluciones propuestas por los otros miembros no funcionan para mí.

Pero encontré esto:

para escapar de un punto en expresión regular de Java escribir [.]

+0

Lo mismo, '\\.' No funcionó: '\ .' se quejó de que' .' no necesita ser escapado, '\\.' Lo hizo pensar que era '\ .' en lugar de '.', ' \\\. 'Y el generador arrojó un error, ' [.] 'Fue lo único que funcionó. – mithunc

1

Aquí es el código se puede copiar directamente pegar:

String imageName = "picture1.jpg"; 
String [] imageNameArray = imageName.split("\\."); 
for(int i =0; i< imageNameArray.length ; i++) 
{ 
    system.out.println(imageNameArray[i]); 
} 

¿Y si por error hay espacios izquierda antes o después de "." ¿en esos casos? Siempre es una buena práctica considerar esos espacios también.

String imageName = "picture1 . jpg"; 
String [] imageNameArray = imageName.split("\\s*.\\s*"); 
    for(int i =0; i< imageNameArray.length ; i++) 
    { 
     system.out.println(imageNameArray[i]); 
    } 

Aquí, \\ s * ¿hay que considerar los espacios y darle cuerdas splitted única requeridos.

Cuestiones relacionadas