simbolos regulares probar expresiones ejemplos java regex

java - probar - expresiones regulares simbolos



¿Cuál es la diferencia entre / z y / Z en una expresión regular y cuándo y cómo lo uso? (5)

Aunque /Z y $ coinciden solo al final de la cadena (cuando la opción para el símbolo de intercalación y el dólar coinciden en los saltos de línea incrustados está desactivada), hay una excepción. Si la cadena termina con un salto de línea, entonces /Z y $ coincidirán en la posición anterior a ese salto de línea, en lugar de al final de la cadena.

Esta "mejora" fue introducida por Perl, y es copiada por muchos sabores de expresiones regulares, incluyendo Java, .NET y PCRE. En Perl, cuando lee una línea de un archivo, la cadena resultante terminará con un salto de línea. Al leer una línea de un archivo con el texto "joe" se obtiene la cadena joe / n. Cuando se aplica a esta cadena, tanto ^[az]+$ como /A[az]+/Z coincidirán con "joe".

Si solo desea una coincidencia en el extremo absoluto de la cadena, use /z (minúscula z en lugar de mayúscula Z). /A[az]+/z no coincide con joe / n. /z coincide después del salto de línea, que no coincide con la clase de caracteres.

http://www.regular-expressions.info/anchors.html

La forma en que leo este "StackOverflow/n".matches("StackOverflow//z") debería devolver falso porque su patrón no incluye la nueva línea.

"StackOverflow/n".matches("StackOverflow//z//n") => false "StackOverflow/n".matches("StackOverflow//Z//n") => true

De http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Pattern.html :

/Z The end of the input but for the final terminator, if any /z The end of the input

Pero, ¿qué significa en la práctica? ¿Puedes darme un ejemplo cuando uso / Z o / z?

En mi prueba, pensé que "StackOverflow/n".matches("StackOverflow//z") devolverá true y "StackOverflow/n".matches("StackOverflow//Z") devuelve falso. Pero en realidad ambos devuelven falso. ¿Dónde está el error?


Como dijo Eyal, funciona para find () pero no para matchs ().

Esto realmente tiene sentido. El anclaje / Z en sí coincide realmente con la posición justo antes del terminador eol final, pero la expresión regular como un todo no concuerda, porque, como un todo, necesita coincidir con el texto completo que se está emparejando, y nada coincide con el terminador. (La / Z coincide con la posición justo antes del terminador, que no es lo mismo).

Si hiciste "/n".matches("//Z.*") deberías estar bien.


Creo que el principal problema aquí es el comportamiento inesperado de matches() : cualquier coincidencia debe consumir toda la cadena de entrada . Ambos ejemplos fallan porque las expresiones regulares no consumen el salto de línea al final de la cadena. Los anclajes no tienen nada que ver con eso.

En la mayoría de los idiomas, una coincidencia de expresiones regulares puede ocurrir en cualquier lugar, consumiendo todas, algunas o ninguna cadena de entrada. Y Java tiene un método, Matcher#find() , que realiza este tipo de coincidencia tradicional. Sin embargo, los resultados son opuestos a lo que dijiste que esperabas:

Pattern.compile("//z").matcher("/n").find() //false Pattern.compile("//Z").matcher("/n").find() //true

En el primer ejemplo, /z necesita coincidir con el final de la cadena, pero el salto de línea final está en el camino. En el segundo, /Z coincide con el avance de línea, que se encuentra al final de la cadena.


Solo lo revisé. Parece que cuando se invoca Matcher.matches () (como en el código, detrás de las escenas), / Z se comporta como / z. Sin embargo, cuando se invoca Matcher.find (), se comportan de manera diferente a lo esperado. Lo siguiente devuelve verdadero:

Pattern p = Pattern.compile("//Z"); Matcher m = p.matcher("/n"); System.out.println(m.find());

y si reemplaza / Z con / z, devuelve falso.

Encuentro esto un poco sorprendente ...


/Z es lo mismo que $ , coincide con el final de la cadena, al final de la cadena puede ir seguido de un salto de línea.

/z coincide con el final de la cadena, no puede ir seguido de un salto de línea.