É uma pena que diferentes mecanismos regex tenham diferentes meios para corresponder aos alfanuméricos. Uma pergunta como essa (bastante vaga, sem sabor de idioma / regex indicado) requer uma resposta muito longa, ou pelo menos muito organizada, sobre cada sabor.
Wiktor Stribiżew
Respostas:
939
Para corresponder a uma sequência que contém apenas esses caracteres (ou uma sequência vazia), tente
"^[a-zA-Z0-9_]*$"
Isso funciona para expressões regulares do .NET e provavelmente para muitas outras linguagens.
Dividindo:
^: start ofstring[: beginning of character group
a-z : any lowercase letter
A-Z : any uppercase letter
0-9: any digit
_ : underscore
]:endof character group*: zero or more of the given characters
$ :endofstring
Se você não deseja permitir cadeias vazias, use + em vez de *.
Como outros já apontaram, algumas línguas regex têm uma forma abreviada para [a-zA-Z0-9_]. Na linguagem regex do .NET, você pode ativar o comportamento do ECMAScript e usá-lo \wcomo atalho (produzindo ^\w*$ou ^\w+$). Observe que em outros idiomas, e por padrão no .NET, \wé um pouco mais amplo e também corresponderá a outros tipos de caracteres Unicode (obrigado Jan por apontar isso). Portanto, se você realmente deseja corresponder apenas a esses caracteres, provavelmente é melhor usar o formulário explícito (mais longo).
Se você for à Alemanha ou vir algum texto em alemão, verá o que estou dizendo.
Programador Windows
30
\ w e [A-Za-z0-9_] não são equivalentes na maioria dos tipos de expressões regulares. \ w inclui letras com sinais diacríticos, letras de outros scripts, etc.
Jan Goyvaerts
4
A pergunta original dizia "letras maiúsculas e minúsculas"; portanto, parece que "letras" de scripts não latinos devem corresponder.
Trejkaz
3
[\p{upper}\p{lower}\p{gc=Number}_]é tudo o que você precisa para fazer isso corretamente, presumindo que não haja caracteres combinados.
tchrist
1
Parece que preg_match exige que seu padrão seja delimitado por delimitadores, que normalmente são barras. Então você precisaria de "/ ^ [a-zA-Z0-9 _] * $ /". Consulte esta pergunta para obter mais informações: stackoverflow.com/questions/6445133/… . Veja também esta página: forums.phpfreaks.com/topic/…
Charlie
346
Há muita verbosidade aqui, e sou profundamente contra, portanto, minha resposta conclusiva seria:
/^\w+$/
\wé equivalente a [A-Za-z0-9_], que é praticamente o que você deseja. (a menos que introduzamos unicode no mix)
Usando o +quantificador, você corresponderá a um ou mais caracteres. Se você também deseja aceitar uma string vazia, use *.
O inglês não é o único idioma do mundo; portanto, essa deve ser a resposta aceita, não as [a-z]variações. \wtambém capturará caracteres não latinos. Gosto šēēāouкукареку
Alex
1
Validado na página 318 das O'Reilly "Mastering Regular Expressions"
guidotex 16/11/1918
36
Você deseja verificar se cada personagem corresponde aos seus requisitos, e é por isso que usamos:
[A-Za-z0-9_]
E você pode até usar a versão abreviada:
\w
O que é equivalente (em alguns tipos de expressão regular, verifique se você o fez antes de usá-lo). Em seguida, para indicar que a sequência inteira deve corresponder, use:
^
Para indicar que a sequência deve começar com esse caractere, use
$
Para indicar que a sequência deve terminar com esse caractere. Então use
\w+or \w*
Para indicar "1 ou mais" ou "0 ou mais". Juntando tudo, temos:
\ w e [A-Za-z0-9_] não são equivalentes na maioria dos tipos de expressões regulares. \ w inclui letras com sinais diacríticos, letras de outros scripts, etc.
Jan Goyvaerts
32
Um ... pergunta: ele precisa ter pelo menos um caractere ou não? Pode ser uma string vazia?
^[A-Za-z0-9_]+$
Realizará pelo menos um alfanumérico ou sublinhado em maiúsculas ou minúsculas. Se o comprimento for zero, substitua + por *
^[A-Za-z0-9_]*$
Editar:
Se for necessário incluir diacríticos (como cedilla - ç), você precisará usar a palavra caractere que faz o mesmo que o acima, mas inclui os caracteres diacríticos:
Bem, agora que você mencionou, eu também perdi um monte de outros personagens franceses ...
BenAlabaster
1
\ w é o mesmo que [\ w] com menos esforço de digitação
Jan Goyvaerts
Sim, você ainda precisa a + ou * e ^ e $ - \ w verifica apenas que ele contém caracteres de palavra, não que isso única contém caracteres de palavras ...
BenAlabaster
estranhamente, isso ainda permite o sinal de $.
Induster
@Induster, é por causa do que BenAlabaster apenas apontou
No entanto, embora a documentação nos links acima afirme que \w"Corresponde a qualquer caractere no intervalo 0 - 9, A - Z e a - z (equivalente a POSIX [: alnum:])", não achei que isso fosse verdade . Não de grep -Pqualquer maneira. Você precisa incluir explicitamente o sublinhado se você usar, [:alnum:]mas não se você usar \w. Você não pode vencer o seguinte para curto e doce:
^\w+$
Juntamente com a legibilidade, o uso das classes de caracteres POSIX ( http://www.regular-expressions.info/posixbrackets.html ) significa que seu regex pode funcionar em cadeias não ASCII, que os regexes baseados em intervalo não farão, pois contam com a ordem subjacente dos caracteres ASCII que podem ser diferentes de outros conjuntos de caracteres e, portanto, excluirá alguns caracteres não ASCII (letras como œ) que você pode querer capturar.
Em Ciência da Computação, um valor alfanumérico geralmente significa que o primeiro caractere não é um número, mas é um alfabeto ou sublinhado. Em seguida, o carácter pode ser 0-9, A-Z, a-z, ou sublinhado ( _).
Como faríamos se quisermos adicionar _ e - à lista?
Rahi
10
Experimente estas extensões multilíngues que criei para string.
IsAlphaNumeric - A string deve conter pelo menos 1 alfa (letra no intervalo Unicode, especificado em charSet) e pelo menos 1 número (especificado em numSet). Além disso, a string deve incluir apenas alfa e números.
IsAlpha - String deve conter pelo menos 1 alfa (no idioma charSet especificado) e incluir apenas alfa.
IsNumeric - A string deve conter pelo menos 1 número (no idioma especificado numSet) e incluir apenas números.
O intervalo charSet / numSet para o idioma desejado pode ser especificado. Os intervalos Unicode estão disponíveis no link abaixo:
//Englishstring test ="AASD121asf";//Greek//string test = "Ϡϛβ123";//Bengali//string test = "শর৩৮";//Hindi//string test = @"क़लम३७ख़";bool isAlphaNum = test.IsAlphaNumeric();
@ Shah: eu adicionei os únicos alfabetos (e apenas números também).
achou
8
A seguinte expressão regular corresponde a caracteres alfanuméricos e sublinhado:
^[a-zA-Z0-9_]+$
Por exemplo, no Perl:
#!/usr/bin/perl -wmy $arg1 = $ARGV[0];# check that the string contains *only* one or more alphanumeric chars or underscoresif($arg1 !~/^[a-zA-Z0-9_]+$/){print"Failed.\n";}else{print"Success.\n";}
O padrão no seu código está correto, mas o padrão acima verifica apenas uma única instância.
BenAlabaster 3/08/08
Isso foi intencional, o exemplo de código foi planejado como um uso esclarecedor na verificação de uma string. Também porque o código também possui marcadores de início e fim de linha que não estão no exemplo de regex.
Jay
1
@Windows programmer - en.wikipedia.org/wiki/Alphanumeric - alfabeto latino , não "conjunto de caracteres latinos", que inclui diacríticos, etc. É um problema semântico, mas eu pessoalmente uso o uso comum do termo alfanumérico como AZ e 0-9.
Jay
2
ñ é uma letra do alfabeto em espanhol, inclusive na América Latina.
Programador Windows
2
"Gostaria de ter uma expressão regular que verifique se uma string contém apenas letras maiúsculas e minúsculas, números e sublinhados" não a limita a letras latinas. "O seguinte regex corresponde a caracteres alfanuméricos e sublinhado" não o limita a letras latinas. "^ [a-zA-Z0-9 _] + $" falha.
A pergunta original não exigia que a carta estivesse presente.
Dmitry Kuzminov 24/12/19
De qual carta você está falando? Meu regex contém aquele solicitado na pergunta. Alfabetos, números, sublinhado
Chinmaya Pati
a 1234é a palavra do idioma solicitado pelo autor. Seu idioma é mais restritivo.
Dmitry Kuzminov 25/12/19
4
Para mim, houve um problema em que desejo distinguir entre alfa, numérico e alfa numérico; portanto, para garantir que uma sequência alfanumérica contenha pelo menos um alfa e pelo menos um numérico, usei:
Se você quiser apenas fazer Latina p {Latina} em vez de p {L}
Agustin
2
Eu acredito que você não está usando caracteres latinos e Unicode em suas partidas. Por exemplo, se você precisar usar caracteres "ã" ou "ü", o uso de "\ w" não funcionará.
Isso funciona para mim, encontrei isso nas "Mastering Regular Expressions" da O'Reilly:
/^\w+$/
Explicação:
^ afirma a posição no início da string
\ w + corresponde a qualquer caractere de palavra (igual a [a-zA-Z0-9_])
"+" Quantificador - Corresponde entre uma e várias vezes, quantas vezes for possível, devolvendo o que for necessário (ganancioso)
$ afirma a posição no final da string
Verifique-se:
const regex =/^\w+$/;const str =`nut_cracker_12`;let m;if((m = regex.exec(str))!==null){// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex)=>{
console.log(`Found match, group ${groupIndex}: ${match}`);});}
Respostas:
Para corresponder a uma sequência que contém apenas esses caracteres (ou uma sequência vazia), tente
Isso funciona para expressões regulares do .NET e provavelmente para muitas outras linguagens.
Dividindo:
Se você não deseja permitir cadeias vazias, use + em vez de *.
Como outros já apontaram, algumas línguas regex têm uma forma abreviada para
[a-zA-Z0-9_]
. Na linguagem regex do .NET, você pode ativar o comportamento do ECMAScript e usá-lo\w
como atalho (produzindo^\w*$
ou^\w+$
). Observe que em outros idiomas, e por padrão no .NET,\w
é um pouco mais amplo e também corresponderá a outros tipos de caracteres Unicode (obrigado Jan por apontar isso). Portanto, se você realmente deseja corresponder apenas a esses caracteres, provavelmente é melhor usar o formulário explícito (mais longo).fonte
[\p{upper}\p{lower}\p{gc=Number}_]
é tudo o que você precisa para fazer isso corretamente, presumindo que não haja caracteres combinados.Há muita verbosidade aqui, e sou profundamente contra, portanto, minha resposta conclusiva seria:
\w
é equivalente a[A-Za-z0-9_]
, que é praticamente o que você deseja. (a menos que introduzamos unicode no mix)Usando o
+
quantificador, você corresponderá a um ou mais caracteres. Se você também deseja aceitar uma string vazia, use*
.fonte
\w
geralmente não é restrito apenas ao ASCII.[a-z]
variações.\w
também capturará caracteres não latinos. Gostošēēā
ouкукареку
Você deseja verificar se cada personagem corresponde aos seus requisitos, e é por isso que usamos:
E você pode até usar a versão abreviada:
O que é equivalente (em alguns tipos de expressão regular, verifique se você o fez antes de usá-lo). Em seguida, para indicar que a sequência inteira deve corresponder, use:
Para indicar que a sequência deve começar com esse caractere, use
Para indicar que a sequência deve terminar com esse caractere. Então use
Para indicar "1 ou mais" ou "0 ou mais". Juntando tudo, temos:
fonte
Um ... pergunta: ele precisa ter pelo menos um caractere ou não? Pode ser uma string vazia?
Realizará pelo menos um alfanumérico ou sublinhado em maiúsculas ou minúsculas. Se o comprimento for zero, substitua + por *
Editar:
Se for necessário incluir diacríticos (como cedilla - ç), você precisará usar a palavra caractere que faz o mesmo que o acima, mas inclui os caracteres diacríticos:
Ou
fonte
Embora seja mais detalhado
\w
, aprecio pessoalmente a legibilidade dos nomes completos das classes de caracteres POSIX ( http://www.zytrax.com/tech/web/regex.htm#special ), então eu diria:No entanto, embora a documentação nos links acima afirme que
\w
"Corresponde a qualquer caractere no intervalo 0 - 9, A - Z e a - z (equivalente a POSIX [: alnum:])", não achei que isso fosse verdade . Não degrep -P
qualquer maneira. Você precisa incluir explicitamente o sublinhado se você usar,[:alnum:]
mas não se você usar\w
. Você não pode vencer o seguinte para curto e doce:Juntamente com a legibilidade, o uso das classes de caracteres POSIX ( http://www.regular-expressions.info/posixbrackets.html ) significa que seu regex pode funcionar em cadeias não ASCII, que os regexes baseados em intervalo não farão, pois contam com a ordem subjacente dos caracteres ASCII que podem ser diferentes de outros conjuntos de caracteres e, portanto, excluirá alguns caracteres não ASCII (letras como œ) que você pode querer capturar.
fonte
Em Ciência da Computação, um valor alfanumérico geralmente significa que o primeiro caractere não é um número, mas é um alfabeto ou sublinhado. Em seguida, o carácter pode ser
0-9
,A-Z
,a-z
, ou sublinhado (_
).Aqui está como você faria isso:
Testado em php:
ou pegue isso
e coloque-o na sua linguagem de desenvolvimento.
fonte
E se:
... se você quiser ser explícito, ou:
... se você preferir conciso (sintaxe Perl).
fonte
use lookaheads para fazer o "pelo menos um" item. Confie em mim, é muito mais fácil.
Aqui está um exemplo que exigiria de 1 a 10 caracteres, contendo pelo menos um dígito e uma letra:
NOTA: poderia ter usado \ w, mas as considerações ECMA / Unicode entram em jogo aumentando a cobertura de caracteres do \ w "caractere da palavra".
fonte
Experimente estas extensões multilíngues que criei para string.
IsAlphaNumeric - A string deve conter pelo menos 1 alfa (letra no intervalo Unicode, especificado em charSet) e pelo menos 1 número (especificado em numSet). Além disso, a string deve incluir apenas alfa e números.
IsAlpha - String deve conter pelo menos 1 alfa (no idioma charSet especificado) e incluir apenas alfa.
IsNumeric - A string deve conter pelo menos 1 número (no idioma especificado numSet) e incluir apenas números.
O intervalo charSet / numSet para o idioma desejado pode ser especificado. Os intervalos Unicode estão disponíveis no link abaixo:
http://www.ssec.wisc.edu/~tomw/java/unicode.html
API:
Uso:
fonte
A seguinte expressão regular corresponde a caracteres alfanuméricos e sublinhado:
Por exemplo, no Perl:
fonte
Isso deve funcionar na maioria dos casos.
/^[\d]*[a-z_][a-z\d_]*$/gi
E por mais que eu quero dizer,
Explicação
^ ... $
- combine o padrão começando e terminando com[\d]*
- corresponde a zero ou mais dígitos[a-z_]
- corresponde a um alfabeto ou sublinhado[a-z\d_]*
- corresponde a um alfabeto ou dígito ou sublinhado/gi
- corresponda globalmente na cadeia e não diferencia maiúsculas de minúsculasfonte
1234
é a palavra do idioma solicitado pelo autor. Seu idioma é mais restritivo.Para mim, houve um problema em que desejo distinguir entre alfa, numérico e alfa numérico; portanto, para garantir que uma sequência alfanumérica contenha pelo menos um alfa e pelo menos um numérico, usei:
fonte
Aqui está a regex do que você deseja com um quantificador para especificar pelo menos 1 caractere e não mais que 255 caracteres
fonte
Para aqueles que procuram correspondência alfanumérica unicode, convém fazer algo como:
Leitura adicional em http://unicode.org/reports/tr18/ e em http://www.regular-expressions.info/unicode.html
fonte
Eu acredito que você não está usando caracteres latinos e Unicode em suas partidas. Por exemplo, se você precisar usar caracteres "ã" ou "ü", o uso de "\ w" não funcionará.
Como alternativa, você pode usar esta abordagem:
Espero que ajude!
fonte
Para verificar a cadeia inteira e não permitir cadeias vazias, tente
fonte
^\w*$
funcionará para as combinações abaixofonte
isso funciona para mim, você pode tentar
fonte
Isso funciona para mim, encontrei isso nas "Mastering Regular Expressions" da O'Reilly:
Explicação:
Verifique-se:
fonte