combinações de método não funcionam bem

Eu não entendo porque com este regex o método retorna false;

Pattern.matches("\\bi", "an is"); 

o personagem i está em um limite de palavra!

Em Java, as matches tentam corresponder um padrão à cadeia inteira .

Isso vale para String.matches , Pattern.matches e Matcher.matches .

Se você quiser verificar se há uma correspondência em algum lugar em uma string, você pode usar .*\bi.* . Neste caso, como um literal de string Java, é ".*\\bi.*" .

Links da API java.util.regex.Matcher

  • boolean matches() : tenta combinar a região inteira com o padrão.

O que significa

Como usado aqui, o ponto . é um metacaractere de expressão regular que significa (quase) qualquer caractere. * é um metacaractere de expressão regular que significa “zero-ou-mais repetição de”. Então, por exemplo, algo como A.*B corresponde a A , seguido por zero ou mais de “qualquer” caractere, seguido por B ( veja em rubular.com ).

Referências

  • regular-expressions.info/Repetition com Star e Plus e The Dot Matches (Quase) qualquer caractere

Perguntas relacionadas

  • Diferença entre .*? e .* para regex

Note que tanto o . e * (assim como outros metacaracteres) podem perder seu significado especial dependendo de onde aparecem. [.*] é uma class de caractere que corresponde a um período literal . ou um asterisco literal * . Precedido por uma barra invertida também escapa metacaracteres, portanto, a\.b corresponde a "ab" .

  • regular-expressions.info/Caracter Class e Literal Characters e Metacharacters

Problemas relacionados

Java não possui fins baseados em endsWith , startsWith e contains . Você ainda pode usar matches para realizar as mesmas coisas da seguinte maneira:

  • matches(".*pattern.*") – ele contém uma correspondência do padrão em qualquer lugar?
  • matches("pattern.*") – começa com uma correspondência do padrão ?
  • matches(".*pattern") – termina com uma correspondência do padrão ?

Folha de dicas rápida da API String

Aqui está uma rápida lista que lista quais methods são baseados em regex e quais não são:

  • Métodos não-regex:
    • String replace(char oldChar, char newChar)
    • String replace(CharSequence target, CharSequence replacement)
    • boolean startsWith(String prefix)
    • boolean endsWith(String suffix)
    • boolean contains(CharSequence s)
  • Métodos Regex:
    • String replaceAll(String regex, String replacement)
    • String replaceFirst(String regex, String replacement)
    • String[] split(String regex)
    • boolean matches(String regex)

A string inteira deve corresponder se você usar correspondências:

 Pattern.matches(".*\\bi.*", "an is") 

Isso permite que 0 ou mais caracteres antes e depois. Ou:

 boolean anywhere = Pattern.compile("\\bi").matcher("an is").find(); 

informará se alguma substring corresponde (true neste caso). Como nota, a compilation de expressões regulares, mantendo-as em volta, pode melhorar o desempenho.

Eu não entendo porque o Java decidiu ir na direção oposta de linguagens como o Perl que suportou a regex nativamente por anos. Joguei o regex Java padrão e comecei a usar meu próprio regex lib em estilo Perl para Java chamado MentaRegex . Veja abaixo como o regex pode fazer sentido em Java.

O método corresponde retorna um booleano dizendo se temos uma correspondência de expressão regular ou não.

 matches("Sergio Oliveira Jr.", "/oliveira/i" ) => true 

A correspondência do método retorna uma matriz com os grupos correspondidos. Portanto, não só informa se você tem uma correspondência ou não, mas também retorna os grupos correspondidos, caso você tenha uma correspondência.

 match("aa11bb22", "/(\\d+)/g" ) => ["11", "22"] 

O método sub permite realizar substituições com regex.

 sub("aa11bb22", "s/\\d+/00/g" ) => "aa00bb00" 

Suporte a regex global e insensível a maiúsculas e minúsculas.

 match("aa11bb22", "/(\\d+)/" ) => ["11"] match("aa11bb22", "/(\\d+)/g" ) => ["11", "22"] matches("Sergio Oliveira Jr.", "/oliveira/" ) => false matches("Sergio Oliveira Jr.", "/oliveira/i" ) => true 

Permite que você altere o caractere de escape no caso de não gostar de ver tantos ‘\’.

 match("aa11bb22", "/(\\d+)/g" ) => ["11", "22"] match("aa11bb22", "/(#d+)/g", '#' ) => ["11", "22"]