Espressione regolare per caratteri alfanumerici e di sottolineatura


585

Vorrei avere un'espressione regolare che controlla se una stringa contiene solo lettere maiuscole e minuscole, numeri e caratteri di sottolineatura.

regex 

9
È un peccato che diversi motori regex abbiano mezzi diversi per abbinare i caratteri alfanumerici. Una domanda come questa (piuttosto vaga, senza alcun linguaggio / sapore regex indicato) richiede una risposta molto lunga, o almeno molto organizzata, che si sofferma su ogni sapore.
— Wiktor Stribiżew,

Risposte:


939

Per abbinare una stringa che contiene solo quei caratteri (o una stringa vuota), prova

"^[a-zA-Z0-9_]*$"

Funziona con le espressioni regolari di .NET e probabilmente anche con molte altre lingue.

Abbattendo:

^ : 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 non si desidera consentire stringhe vuote, utilizzare + invece di *.


Come altri hanno sottolineato, alcune lingue regex hanno una forma abbreviata per [a-zA-Z0-9_]. Nel linguaggio regex .NET, è possibile attivare il comportamento ECMAScript e utilizzare \wcome scorciatoia (cedimento ^\w*$o ^\w+$). Si noti che in altre lingue, e per impostazione predefinita in .NET, \wè un po 'più ampio e corrisponderà anche ad altri tipi di caratteri Unicode (grazie a Jan per averlo sottolineato). Quindi, se hai davvero intenzione di abbinare solo quei personaggi, usare la forma esplicita (più lunga) è probabilmente la cosa migliore.


8
Se mai andrai in Germania o vedrai quasi qualsiasi testo tedesco, vedrai quello che sto dicendo.
— Programmatore di Windows il

30
\ w e [A-Za-z0-9_] non sono equivalenti nella maggior parte dei sapori regex. \ w include lettere con segni diacritici, lettere di altri script, ecc.
— Jan Goyvaerts,

4
La domanda originale diceva "lettere maiuscole e minuscole", quindi sembrerebbe che le "lettere" di script non latini debbano corrispondere.
— Trejkaz,

3
[\p{upper}\p{lower}\p{gc=Number}_]è tutto ciò che serve per farlo bene, presumendo che non ci siano personaggi combinati.
— tchrist,

1
Sembra che preg_match richieda che il tuo pattern sia racchiuso tra delimitatori, che normalmente sono barre. Quindi avresti bisogno di "/ ^ [a-zA-Z0-9 _] * $ /". Vedi questa domanda per maggiori informazioni: stackoverflow.com/questions/6445133/… . Vedi anche questa pagina: forums.phpfreaks.com/topic/…
— Charlie,

346

C'è molta verbosità qui, e sono profondamente contrario, quindi la mia risposta conclusiva sarebbe:

/^\w+$/

\wè equivalente a [A-Za-z0-9_], che è praticamente quello che vuoi. (a meno che non introduciamo unicode nel mix)

Usando il +quantificatore abbinerai uno o più caratteri. Se vuoi accettare anche una stringa vuota, usa *invece.


67
\wdi solito non è limitato al solo ASCII.
— tchrist,

26
L'inglese non è l'unica lingua al mondo, quindi questa dovrebbe essere la risposta accettata, non la [a-z]e le sue variazioni. \wacquisirà anche caratteri non latini. Come šēēāoкукареку
— Alex,

1
Convalidato a pagina 318 del "Mastering Regular Expressions" di
— O'Reilly

36

Vuoi verificare che ogni personaggio soddisfi i tuoi requisiti, motivo per cui usiamo:

[A-Za-z0-9_]

E puoi anche usare la versione abbreviata:

\w

Che è equivalente (in alcuni sapori regex, quindi assicurati di controllare prima di usarlo). Quindi per indicare che l'intera stringa deve corrispondere, si utilizza:

^

Per indicare che la stringa deve iniziare con quel carattere, quindi utilizzare

$

Per indicare che la stringa deve terminare con quel carattere. Quindi utilizzare

\w+ or \w*

Per indicare "1 o più" o "0 o più". Mettendo tutto insieme, abbiamo:

^\w*$

10
\ w e [A-Za-z0-9_] non sono equivalenti nella maggior parte dei sapori regex. \ w include lettere con segni diacritici, lettere di altri script, ecc.
— Jan Goyvaerts,

32

Um ... domanda: deve avere almeno un personaggio o no? Può essere una stringa vuota?

^[A-Za-z0-9_]+$

Farà almeno un carattere alfanumerico o di sottolineatura maiuscolo o minuscolo. Se può avere una lunghezza pari a zero, sostituisci + con *

^[A-Za-z0-9_]*$

Modificare:

Se è necessario includere i segni diacritici (come cedilla - ç), è necessario utilizzare il carattere parola che fa lo stesso del precedente, ma include i caratteri diacritici:

^\w+$

O

^\w*$

Bene, ora che me lo dici, mi sono perso anche un sacco di altri personaggi francesi ...
— BenAlabaster,

1
\ w è lo stesso di [\ w] con meno sforzo di battitura
— Jan Goyvaerts il

Sì, hai ancora bisogno del + o * e del ^ e $ - \ w verifica solo che contenga caratteri di parole, non che contenga solo caratteri di parole ...
— BenAlabaster,

stranamente, questo consente ancora il segno $.
— Induster

@Induster, è per quello che BenAlabaster ha appena sottolineato
— Sebas il

27

Sebbene sia più dettagliato di \w, apprezzo personalmente la leggibilità dei nomi completi delle classi di caratteri POSIX ( http://www.zytrax.com/tech/web/regex.htm#special ), quindi direi:

^[[:alnum:]_]+$

Tuttavia, mentre la documentazione ai link sopra afferma che \w"Corrisponderà a qualsiasi carattere nell'intervallo 0 - 9, A - Z e a - z (equivalente di POSIX [: alnum:])", non ho trovato che questo sia vero . Non grep -Pcomunque. È necessario includere esplicitamente il carattere di sottolineatura se si utilizza [:alnum:]ma non se si utilizza \w. Non puoi battere quanto segue in breve e dolce:

^\w+$

Insieme alla leggibilità, l'uso delle classi di caratteri POSIX ( http://www.regular-expressions.info/posixbrackets.html ) significa che il tuo regex può funzionare su stringhe non ASCII, cosa che i regex basati su intervallo non faranno poiché si basano su l'ordinamento sottostante dei caratteri ASCII che può essere diverso dagli altri set di caratteri e pertanto escluderà alcuni caratteri non ASCII (lettere come œ) che potresti voler catturare.


22

In Informatica, un valore alfanumerico spesso indica che il primo carattere non è un numero ma è un alfabeto o un trattino basso. Successivamente il carattere può essere 0-9, A-Z, a-z, o sottolineatura ( _).

Ecco come lo faresti:

Testato sotto php:

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

o prendi questo

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

e inseriscilo nel tuo linguaggio di sviluppo.


17

Che ne dite di:

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

... se vuoi essere esplicito, oppure:

^\w+$

... se preferisci la sintassi (sintassi Perl).


12

usa i lookahead per fare "almeno una" roba. Fidati di me è molto più facile.

Ecco un esempio che richiederebbe 1-10 caratteri, contenente almeno una cifra e una lettera:

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

NOTA: avrebbe potuto usare \ w ma poi entrano in gioco le considerazioni ECMA / Unicode aumentando la copertura dei caratteri del \ w "carattere parola".


Come faremmo se volessimo aggiungere _ e - all'elenco?
— Rahi,

10

Prova queste estensioni multilingue che ho creato per la stringa.

IsAlphaNumeric - La stringa deve contenere almeno 1 alfa (lettera nell'intervallo Unicode, specificato in charSet) e almeno 1 numero (specificato in numSet). Inoltre, la stringa dovrebbe comprendere solo alfa e numeri.

IsAlpha - String deve contenere almeno 1 alpha (nella lingua charSet specificata) e comprendere solo alpha.

IsNumeric: la stringa deve contenere almeno 1 numero (nella lingua numSet specificata) e comprendere solo numeri.

È possibile specificare l'intervallo charSet / numSet per la lingua desiderata. Gli intervalli Unicode sono disponibili sul link seguente:

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

Utilizzo:

        //English
        string test = "AASD121asf";

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

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

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

        bool isAlphaNum = test.IsAlphaNumeric();

@Shah: ho aggiunto gli unici alfabeti (e anche solo i numeri).
— Shantanu,

8

La seguente regex corrisponde ai caratteri alfanumerici e al carattere di sottolineatura:

^[a-zA-Z0-9_]+$

Ad esempio, in 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";
}

Il modello nel codice è corretto, ma il modello sopra controlla solo una singola istanza.
— BenAlabaster il

Quello era intenzionale, l'esempio di codice era inteso come un uso chiarificatore nel controllo di una stringa. Anche perché il codice ha anche i marcatori di inizio e fine linea che non sono nell'esempio regex.
— Jay,

1
Programmatore di @Windows - it.wikipedia.org/wiki/Alphanumeric - alfabeto latino , non "set di caratteri latini" che è ciò che include i segni diacritici ecc. Puramente un problema di semantica, ma personalmente seguo l'uso comune del termine alfanumerico come AZ e 0-9.
— Jay,

2
ñ è una lettera dell'alfabeto in spagnolo, anche in America Latina.
— Programmatore di Windows il

2
"Vorrei avere un'espressione regolare che controlla se una stringa contiene solo lettere maiuscole e minuscole, numeri e caratteri di sottolineatura" non la limita alle lettere latine. "La seguente regex corrisponde a caratteri alfanumerici e trattini bassi" non lo limita alle lettere latine. "^ [a-zA-Z0-9 _] + $" non riesce.
— Programmatore di Windows il

6

Questo dovrebbe funzionare nella maggior parte dei casi.

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

E per molti intendo,

abcd       True
abcd12     True
ab12cd     True
12abcd     True

1234       False


Spiegazione

  1. ^ ... $ - corrisponde allo schema che inizia e termina con
  2. [\d]* - corrisponde a zero o più cifre
  3. [a-z_] - abbina un alfabeto o un trattino basso
  4. [a-z\d_]* - abbina un alfabeto o una cifra o un trattino basso
  5. /gi - Corrispondenza globale sulla stringa e senza distinzione tra maiuscole e minuscole

2
La domanda originale non aveva l'obbligo di presentare la lettera.
— Dmitry Kuzminov,

Di quale lettera stai parlando? La mia regex contiene quella posta nella domanda. Alfabeti, numeri, trattino basso
— Chinmaya Pati

la 1234è la parola dalla lingua richiesta per autore. La tua lingua è più restrittiva.
— Dmitry Kuzminov il

4

Per me c'è stato un problema in cui voglio distinguere tra alfa, numerico e alfanumerico, quindi per garantire che una stringa alfanumerica contenga almeno un alfa e almeno un numerico, ho usato:

^([a-zA-Z_]{1,}\d{1,})+|(\d{1,}[a-zA-Z_]{1,})+$

Esattamente quello che voglio ... Grazie
— Aniket kale il

3

Ecco la regex per ciò che vuoi con un quantificatore per specificare almeno 1 carattere e non più di 255 caratteri

[^a-zA-Z0-9 _]{1,255}


2

Credo che non prenderai personaggi latini e Unicode nelle tue partite. Ad esempio, se devi prendere i caratteri "ã" o "ü", l'uso di "\ w" non funzionerà.

In alternativa, puoi utilizzare questo approccio:

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

Spero che sia d'aiuto!


1

Per controllare l'intera stringa e non consentire stringhe vuote, provare

^[A-Za-z0-9_]+$

1

^\w*$ funzionerà per le seguenti combinazioni

1
123
1av
pRo
av1

Che dire di una linea vuota. È anche una stringa alfanumerica?
— v010dya,

0

questo funziona per me, puoi provare

[\\p{Alnum}_]

0

Questo funziona per me, l'ho trovato nelle "Mastering Regular Expressions" di O'Reilly:

/^\w+$/

Spiegazione:

  • ^ afferma la posizione all'inizio della stringa
    • \ w + corrisponde a qualsiasi carattere di parola (uguale a [a-zA-Z0-9_])
    • "+" Quantificatore - Corrisponde tra una e più volte, il maggior numero di volte possibile, restituendo quanto necessario (avido)
  • $ afferma la posizione alla fine della stringa

Verifica te stesso:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.