2011-01-25 18 views
8

cuestión trivial expresiones regulares (la respuesta es más probable Java-específico):¿Por qué esta expresión regular no funciona como se espera en Java?

"#This is a comment in a file".matches("^#") 

Esto devuelve falso. Por lo que puedo ver, ^ significa lo que siempre significa y # no tiene un significado especial, así que traduje ^# como "A '#' al comienzo de la cadena". Que debería coincidir Y lo hace, en Perl:

perl -e "print '#This is a comment'=~/^#/;" 

imprime "1". Así que estoy bastante seguro de que la respuesta es algo específico de Java. ¿Alguien por favor me iluminaría?

Gracias.

Respuesta

17

Matcher.matches() comprueba si la cadena de entrada completa coincide con la expresión regular.

Dado que su expresión regular solo coincide con el primer carácter, devuelve false.

En su lugar, querrá usar Matcher.find().

Por supuesto, puede ser un poco difícil de encontrar la especificación concreta, pero está ahí:

+0

Esta es la respuesta correcta, gracias. ¿Está esto documentado en alguna parte? Porque no puedo leer esto de la documentación de String.matches: "Indica si esta cadena coincide con la expresión regular dada". no suena como lo que describiste – 0xCAFEBABE

+0

Siempre he entendido que "coincidencias" implica "toda la información", pero he agregado la explicación completa (y cómo encontrarla) más arriba. –

+0

Muchas gracias. – 0xCAFEBABE

2

El método matches se adapte a su expresión regular contra toda la cadena de .

Así que intente agregar un .* para que coincida con el resto de la cadena.

"#This is a comment in a file".matches("^#.*") 

que devuelve true. Incluso se pueden eliminar todos los anclajes (tanto el principio como el final) de la expresión regular y el método match lo agregará para nosotros. Entonces en el caso anterior también podríamos haber usado "#.*" como la expresión regular.

+0

... que solo funcionará si la cadena no contiene líneas nuevas, a menos que anteponga '(? S)' a su expresión regular ... –

0

Esto debe cumplir con sus expectativas:

"#This is a comment in a file".matches("^#.*$") 

Ahora la entrada de cadena coincide con el patrón "primer carácter será #, el resto será cualquier char"


siguiente comentario Joachims, la siguiente es equivalente:

"#This is a comment in a file".matches("#.*") 
+0

En este caso, ambas anclas ('^' y '$') son innecesario, ya que están implícitos en 'matches()'. –

Cuestiones relacionadas