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.*"
.
java.util.regex.Matcher
boolean matches()
: tenta combinar a região inteira com o padrão. 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 ).
.*?
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"
.
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 ? String
Aqui está uma rápida lista que lista quais methods são baseados em regex e quais não são:
String replace(char oldChar, char newChar)
String replace(CharSequence target, CharSequence replacement)
boolean startsWith(String prefix)
boolean endsWith(String suffix)
boolean contains(CharSequence s)
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"]