¿Por qué esta expresión regular no funciona como se espera en Java?

pregunta de expresiones regulares triviales (la respuesta probablemente sea Java-specific):

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

Esto devuelve falso. Hasta donde 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.

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

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

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

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

  • String.matches() se define como hacer lo mismo que Pattern.matches(regex, str) .
  • Pattern.matches() a su vez se define como Pattern.compile(regex).matcher(input).matches() .
    • Pattern.compile() devuelve un Pattern .
    • Pattern.matcher() devuelve un Matcher
  • Matcher.matches() está documentado de esta manera (el énfasis es mío):

    Intenta hacer coincidir toda la región con el patrón.

El método de coincidencias coincide con su expresión regular contra toda la cadena.

Intente agregar a .* Para unir el rest de la cadena.

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

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

Esto debería cumplir con sus expectativas:

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

Ahora la cadena de entrada coincide con el patrón “El primer carácter será # , el rest será cualquier carácter”


Siguiendo el comentario de Joachims, lo siguiente es equivalente:

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