Por que este regex não funciona como esperado em Java?

questão de regex trivial (a resposta é mais provavelmente específica para Java):

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

Isso retorna falso. Tanto quanto eu posso ver, ^ significa o que sempre significa e # não tem nenhum significado especial, então eu traduziria ^# como “A ‘#’ no começo da string”. Qual deve combinar. E assim acontece em Perl:

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

imprime “1”. Então, tenho certeza que a resposta é algo específico para Java. Alguém por favor me esclareceria?

Obrigado.

Matcher.matches() verifica se a string de input inteira é correspondida pela Matcher.matches() .

Como o seu regex corresponde apenas ao primeiro caractere, ele retorna false .

Você vai querer usar Matcher.find() lugar.

Concedido, pode ser um pouco complicado encontrar a especificação concreta, mas está lá:

  • String.matches() é definido como fazendo a mesma coisa que Pattern.matches(regex, str) .
  • Pattern.matches() por sua vez, é definido como Pattern.compile(regex).matcher(input).matches() .
    • Pattern.compile() retorna um Pattern .
    • Pattern.matcher() retorna um Matcher
  • Matcher.matches() é documentado assim (ênfase minha):

    Tenta combinar a região inteira com o padrão.

O método matches corresponde ao seu regex em relação à string inteira .

Portanto, tente adicionar um .* Para corresponder ao restante da string.

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

que retorna true . Pode-se até descartar todas as âncoras (tanto de início quanto de fim) da regex e o método de match irá adicioná-la para nós. Então, no caso acima, poderíamos ter usado também "#.*" Como o regex.

Isso deve atender às suas expectativas:

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

Agora a string de input corresponde ao padrão “Primeiro char será # , o resto será qualquer char”


Após o comentário de Joachims, o seguinte é equivalente:

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