Expressão regular para caracteres alfanuméricos e sublinhados

585

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.


fonte
9
É 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 of string
[ : beginning of character group
a-z : any lowercase letter
A-Z : any uppercase letter
0-9 : any digit
_ : underscore
] : end of character group
* : zero or more of the given characters
$ : end of string

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).

Charlie
fonte
8
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 *.

kch
fonte
67
\wgeralmente não é restrito apenas ao ASCII.
tchrist
26
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*$
Anton
fonte
10
\ 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:

^\w+$

Ou

^\w*$
BenAlabaster
fonte
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
Sebas
27

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:

^[[:alnum:]_]+$

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.

Dia Davis Waterbury
fonte
22

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:

$regex = '/^[A-Za-z_][A-Za-z\d_]*$/'

ou pegue isso

^[A-Za-z_][A-Za-z\d_]*$

e coloque-o na sua linguagem de desenvolvimento.

Danuel O'Neal
fonte
17

E se:

^([A-Za-z]|[0-9]|_)+$

... se você quiser ser explícito, ou:

^\w+$

... se você preferir conciso (sintaxe Perl).

Drew Hall
fonte
12

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:

^(?=.*\d)(?=.*[A-Za-z])[A-Za-z0-9]{1,10}$

NOTA: poderia ter usado \ w, mas as considerações ECMA / Unicode entram em jogo aumentando a cobertura de caracteres do \ w "caractere da palavra".

boooloooo
fonte
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:

http://www.ssec.wisc.edu/~tomw/java/unicode.html

API:

    public static bool IsAlphaNumeric(this string stringToTest)
    {
        //English
        const string charSet = "a-zA-Z";
        const string numSet = @"0-9";

        //Greek
        //const string charSet = @"\u0388-\u03EF";            
        //const string numSet = @"0-9";

        //Bengali
        //const string charSet = @"\u0985-\u09E3";
        //const string numSet = @"\u09E6-\u09EF";

        //Hindi
        //const string charSet = @"\u0905-\u0963";
        //const string numSet = @"\u0966-\u096F";

        return Regex.Match(stringToTest, @"^(?=[" + numSet + @"]*?[" + charSet + @"]+)(?=[" + charSet + @"]*?[" + numSet + @"]+)[" + charSet + numSet +@"]+$").Success;
    }

    public static bool IsNumeric(this string stringToTest)
    {
        //English
        const string numSet = @"0-9";

        //Hindi
        //const string numSet = @"\u0966-\u096F";

        return Regex.Match(stringToTest, @"^[" + numSet + @"]+$").Success;
    }

    public static bool IsAlpha(this string stringToTest)
    {
        //English
        const string charSet = "a-zA-Z";

        return Regex.Match(stringToTest, @"^[" + charSet + @"]+$").Success;
    }

Uso:

        //English
        string test = "AASD121asf";

        //Greek
        //string test = "Ϡϛβ123";

        //Bengali
        //string test = "শর৩৮";

        //Hindi
        //string test = @"क़लम३७ख़";

        bool isAlphaNum = test.IsAlphaNumeric();
Shantanu
fonte
@ 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 -w

my $arg1 = $ARGV[0];

# check that the string contains *only* one or more alphanumeric chars or underscores
if ($arg1 !~ /^[a-zA-Z0-9_]+$/) {
  print "Failed.\n";
} else {
    print "Success.\n";
}
Jay
fonte
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.
Programador Windows
6

Isso deve funcionar na maioria dos casos.

/^[\d]*[a-z_][a-z\d_]*$/gi

E por mais que eu quero dizer,

abcd       True
abcd12     True
ab12cd     True
12abcd     True

1234       False


Explicação

  1. ^ ... $ - combine o padrão começando e terminando com
  2. [\d]* - corresponde a zero ou mais dígitos
  3. [a-z_] - corresponde a um alfabeto ou sublinhado
  4. [a-z\d_]* - corresponde a um alfabeto ou dígito ou sublinhado
  5. /gi - corresponda globalmente na cadeia e não diferencia maiúsculas de minúsculas
Chinmaya Pati
fonte
2
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:

^([a-zA-Z_]{1,}\d{1,})+|(\d{1,}[a-zA-Z_]{1,})+$
mylesmckeown
fonte
Exatamente o que eu quero ... Obrigado #
Aniket kale
3

Aqui está a regex do que você deseja com um quantificador para especificar pelo menos 1 caractere e não mais que 255 caracteres

[^a-zA-Z0-9 _]{1,255}
mson
fonte
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á.

Como alternativa, você pode usar esta abordagem:

^[A-ZÀ-Ýa-zà-ý0-9_]+$

Espero que ajude!

Marcio Martins
fonte
1

Para verificar a cadeia inteira e não permitir cadeias vazias, tente

^[A-Za-z0-9_]+$
David Norman
fonte
1

^\w*$ funcionará para as combinações abaixo

1
123
1av
pRo
av1
Mukund
fonte
Que tal uma linha vazia. Também é uma sequência alfanumérica?
v010dya 17/03
0

isso funciona para mim, você pode tentar

[\\p{Alnum}_]
Saurabh
fonte
0

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}`);
    });
}

Mihir Kumar
fonte