¿Meta carácter Java RegEx (.) Y punto ordinario?

150

En Java RegEx, cómo encontrar la diferencia entre .(punto) el meta carácter y el punto normal como lo usamos en cualquier oración. Cómo manejar este tipo de situación de otros personajes como meta demasiado ( *, +, \d, ...)

JavaUser
fuente

Respuestas:

276

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

Fabian Steeg
fuente
1
esta solución también se aplica a bash
krivar
18
Tenga en cuenta que si escapar de la barra diagonal inversa depende de cómo esté suministrando la expresión regular. si está codificado, debe usar: "\\". , si lee desde una fuente sin formato (por ejemplo, un archivo de texto), usa solo una barra invertida: \.
Paul
25

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

Pero encontré esto:

para escapar de un punto en Java regexp escribir [.]

Kael
fuente
2
Igual, \\.no funcionó para mí: se \.quejó de que .no necesita escapar,\\. hizo pensar que era en \.lugar de ., \\\.y el constructor arrojó un error, [.]fue lo único que funcionó.
mithunc
1
@mithunc Eso es extraño, \\. dentro de un literal de cadena le da lo \.que necesita la expresión regular para ver el punto como un punto literal en lugar del emparejador de cualquier carácter.
klaar
16

Las expresiones regulares de estilo Perl (en las que se basa más o menos el motor de expresiones regulares de Java) tratan los siguientes caracteres como caracteres especiales:

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

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

Por lo tanto, debe escapar de esos (y solo esos) símbolos dependiendo del contexto (o, en el caso de las clases de caracteres, colocarlos en posiciones donde no puedan malinterpretarse).

Es posible que escapen innecesariamente otros caracteres, pero algunos motores de expresiones regulares tratarán esto como errores de sintaxis, por ejemplo \_, causarán un error en .NET.

Algunos otros conducirán a resultados falsos, por ejemplo, \<se interpreta como un literal <en Perl, pero egrepsignifica "límite de palabras".

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

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

Otras lecturas: el blog de Jan Goyvaert, RegexGuru, sobre los metacaracteres que escapan

Tim Pietzcker
fuente
4

Escapar de caracteres especiales con una barra invertida. \., \*, \+, \\d, Y así sucesivamente. Si no está seguro, puede escapar de cualquier carácter no alfabético, ya sea especial o no. Consulte el javadoc para java.util.regex.Pattern para obtener más información.

Christoffer Hammarström
fuente
Escapar caracteres no especiales innecesariamente podría funcionar en algunos idiomas, pero podría fallar en otros, por lo que es mejor no adquirir el hábito.
Tim Pietzcker
1
Sin embargo, esta pregunta es específicamente sobre Java, y docs.oracle.com/javase/6/docs/api/java/util/regex/… dice "Se puede usar una barra diagonal inversa antes de un carácter no alfabético independientemente de si ese carácter es parte de una construcción sin escape ".
Christoffer Hammarström
2

Aquí hay un código que puede copiar y pegar directamente:

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, quedan espacios 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 * está ahí para considerar los espacios y darle solo las cadenas divididas requeridas.

Vyankatesh S Repal
fuente
1

Quería hacer coincidir una cadena que termina con ". *" Para esto tuve que usar lo siguiente:

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

Un poco tonto si lo piensas: D Heres lo que significa. Al comienzo de la cadena puede haber cualquier carácter cero o más veces 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.

Atspulgs
fuente
Solo usa "\\.\\*$"entonces. No es necesario que coincida con el comienzo de la cadena si no le importa.
Ophidian
Sí, estás en lo correcto. Para ser honesto, no puedo recordar el caso de uso para esto: /
Atspulgs
Realmente no fue para ayudarte, sino para ayudar a otros a mirar tu publicación: P
Ophidian
0

Si desea finalizar, verifique si su oración termina con ". ", Entonces debe agregar [\. \ ] $ Al final de su patrón.

Madhu Gogineni
fuente
0

Estoy haciendo una matriz básica en JGrasp y descubrí que con un método de acceso para que una matriz char [] [] use ('.') Para colocar un solo punto.

rgm
fuente