2012-08-31 19 views
12

Tengo una expresión regular con un modificador de # de libra.Significado de libra (#) en una expresión regular

¿Qué significa \# en una expresión regular? ¿Qué significa el # en una expresión regular? ¿Es posible que Java simplemente esté ignorando estos modificadores inválidos?

+0

\ # no es un modificador. – Toto

+0

¿No es un personaje de escape? Sin embargo, no estoy seguro del propósito del #. – AxGryndr

+0

Podría originarse a partir de una expresión gráfica PCRE que utiliza '#' como delimitador. – Joey

Respuesta

12

\# no es un modificador de expresiones regulares válido. Sería técnicamente una forma de escapar de un carácter #, SI el # significaba algo significativo en la expresión regular de Java. Como no es así, Java simplemente ignora esta invalidez y la lee como # en lugar de generar un error.

+10

[La documentación] (http://docs.oracle.com /javase/6/docs/api/java/util/regex/Pattern.html#compile(java.lang.String)) realmente explica esto: "Es un error usar una barra invertida antes de cualquier carácter alfabético que no denota una construcción escapada, estas están reservadas para futuras extensiones del lenguaje de expresiones regulares. Una barra invertida puede usarse antes de un carácter no alfabético, independientemente de si ese carácter es parte de una construcción no escamada ". – millimoose

+0

@millimoose Excelente hallazgo. – Eric

1

Como sospechabas, es solo un error.

Sin duda, me encontré:

String quote = Pattern.quote("_#_"); 

y la salida era:

"\Q_#_\E" 

Así que, claramente, el símbolo de almohadilla ("#") no es un carácter especial para la expresión regular de Java .

Ver: Pattern.quote()

2

solo tenía este mismo problema. Resultó que el programador anterior "se perdió" al cambiar todo el "código antiguo" de # a | y fue un simple error. Encontré esto al verificar todos los demás códigos en la aplicación y no encontré ningún otro símbolo #, pero incluí muchas áreas similares de código con |. Y el | estaba justo al lado del # en este código. Entonces alguien estaba intercambiando expresiones regulares antiguas por expresiones regex nuevas y "perdidas".

Cuestiones relacionadas