O Java matchescoloca um ^ no início e um $ no final das regexes para você. Então matches("[a-z]"), na verdade, procurará / ^ [az] $ /.
Robino 2/08/16
Sim, Robino, você está absolutamente certo.
Mihir
1
Certamente, se você espera matchesprocurar alguma ocorrência de [a-z], deve corresponder a todas elas? Eu não esperaria matchesverificar cada personagem individualmente em relação ao regex.
21418 PhilHibbs às
@Robino: Onde essa funcionalidade é descrita / documentada?
Toru
@ Toru Na página java docs para String.Matches - onde mais? Um Google casual de "java string corresponde à documentação" revela, no resultado principal, a frase "str.matches (regex) produz exatamente o mesmo resultado que a expressão". A palavra importante é "exatamente".
Robino 04/04
Respostas:
323
Bem-vindo ao .matches()método errado de Java ... Ele tenta e corresponde a TODA a entrada. Infelizmente, outros idiomas seguiram o exemplo :(
Se você deseja ver se o regex corresponde a um texto de entrada, use a Pattern, a Matchere o .find()método do correspondente:
Pattern p =Pattern.compile("[a-z]");Matcher m = p.matcher(inputstring);if(m.find())// match
Se o que você deseja é realmente ver se uma entrada possui apenas letras minúsculas, você pode usá-lo .matches(), mas precisa corresponder a um ou mais caracteres: acrescente a +à sua classe de caracteres, como em [a-z]+. Ou use ^[a-z]+$e .find().
Acho centenas de tutoriais incompletos online. Não foi possível encontrar uma boa. Você tem alguma sugestão?
John
Thanx @fge para explicar .matches(). Pode ser que você saiba por que .find()funciona tão devagar neste exemplo ?
Konstantin Konopko
3
O que você quer dizer com outras línguas seguiu o exemplo ? Pelo que sei, apenas C ++ tem um conjunto equivalente de métodos - regex_searche regex_match. No Python, re.matchapenas ancora a correspondência no início da string (como se fosse \Apattern) e o Python 3.x possui um bom .fullmatch()método. Em JS, Go, PHP e .NET, não há métodos regex que ancoram a correspondência implicitamente. Os padrões ElasticSearch, XML Schema e HTML5 / Validators Angluar são sempre ancorados por padrão. No Swift / Objective C, há uma maneira de ancorar o padrão no início com uma opção.
Wiktor Stribiżew
Existe uma maneira oneliner de fazer isso?
Cardinal - Restabelece Monica
44
[a-z]corresponde a um único caractere entre a e z. Portanto, se sua string fosse justa "d", por exemplo, ela seria compatível e impressa.
Você precisa alterar seu regex [a-z]+para corresponder a um ou mais caracteres.
É claro que corresponde a um único caractere, é o que o regexp faz! O que não está claro no entanto (e também não deve ser o caso!) É que o java coloca o prefixo ^e o sufixo em $torno do regexp fornecido, alterando-o indesejadamente e criando bugs estranhos. Eles não devem fazer isso, porque não é assim que o regexp inicial foi criado.
Klaar
28
String.matchesretorna se a sequência inteira corresponde ao regex, não apenas a qualquer substring.
matches
coloca um ^ no início e um $ no final das regexes para você. Entãomatches("[a-z]")
, na verdade, procurará / ^ [az] $ /.matches
procurar alguma ocorrência de[a-z]
, deve corresponder a todas elas? Eu não esperariamatches
verificar cada personagem individualmente em relação ao regex.Respostas:
Bem-vindo ao
.matches()
método errado de Java ... Ele tenta e corresponde a TODA a entrada. Infelizmente, outros idiomas seguiram o exemplo :(Se você deseja ver se o regex corresponde a um texto de entrada, use a
Pattern
, aMatcher
e o.find()
método do correspondente:Se o que você deseja é realmente ver se uma entrada possui apenas letras minúsculas, você pode usá-lo
.matches()
, mas precisa corresponder a um ou mais caracteres: acrescente a+
à sua classe de caracteres, como em[a-z]+
. Ou use^[a-z]+$
e.find()
.fonte
.matches()
. Pode ser que você saiba por que.find()
funciona tão devagar neste exemplo ?regex_search
eregex_match
. No Python,re.match
apenas ancora a correspondência no início da string (como se fosse\Apattern
) e o Python 3.x possui um bom.fullmatch()
método. Em JS, Go, PHP e .NET, não há métodos regex que ancoram a correspondência implicitamente. Os padrões ElasticSearch, XML Schema e HTML5 / Validators Angluar são sempre ancorados por padrão. No Swift / Objective C, há uma maneira de ancorar o padrão no início com uma opção.[a-z]
corresponde a um único caractere entre a e z. Portanto, se sua string fosse justa"d"
, por exemplo, ela seria compatível e impressa.Você precisa alterar seu regex
[a-z]+
para corresponder a um ou mais caracteres.fonte
^
e o sufixo em$
torno do regexp fornecido, alterando-o indesejadamente e criando bugs estranhos. Eles não devem fazer isso, porque não é assim que o regexp inicial foi criado.String.matches
retorna se a sequência inteira corresponde ao regex, não apenas a qualquer substring.fonte
A implementação de regex do Java tenta corresponder a toda a cadeia
diferente das expressões regulares perl, que tentam encontrar uma parte correspondente
se você deseja encontrar uma string com apenas caracteres minúsculos, use o padrão
[a-z]+
se você deseja encontrar uma sequência contendo pelo menos um caractere minúsculo, use o padrão
.*[a-z].*
fonte
Usava
fonte
Já enfrentei o mesmo problema uma vez:
O acima falhou!
O acima trabalhou com padrão dentro
(
e)
.fonte
Sua expressão regular
[a-z]
não corresponde,dkoe
pois corresponde apenas a seqüências de comprimento 1. Use algo como[a-z]+
.fonte
você deve colocar pelo menos uma captura
()
no padrão para corresponder e corrigir o padrão assim:fonte
matches
não tem saída.Você pode tornar seu padrão sem distinção de maiúsculas e minúsculas fazendo:
fonte