Regex per abbinare solo lettere


374

Come posso scrivere una regex che corrisponde solo alle lettere?


58
Qual è la tua definizione di characters? ASCII? Kanji? Iso-XXXX-X? UTF8?
Ivo Wetzel,

45
Qual è la tua definizione di regex? Perl? Emacs? Grep?
Pascal Cuoq,

4
Dato che la domanda è in inglese, su un sito inglese, è lecito supporre che si tratti di caratteri in inglese.
vaer-k,

1
Ho notato che \ p {L} per una lettera e / u flag per Unicode corrisponde a qualsiasi lettera nel mio regex, ovvero/\p{L}+/u
MaxZoom,

4
Given that the question is in English, on an English site, it's fair to assume the question regards characters in English. Questo è vero. Come tutti sappiamo, chi parla inglese non localizza MAI le proprie applicazioni!
Alex

Risposte:


392

Usa un set di caratteri: trova [a-zA-Z]una lettera dalla A alla Z in minuscolo e maiuscolo. [a-zA-Z]+corrisponde a una o più lettere e ^[a-zA-Z]+$corrisponde solo a stringhe costituite da una o più lettere ( ^e $segnare rispettivamente l'inizio e la fine di una stringa).

Se si desidera far corrispondere altre lettere di A-Z, è possibile aggiungerli al set di caratteri: [a-zA-ZäöüßÄÖÜ]. Oppure si utilizzano classi di caratteri predefinite come la classe di proprietà del carattere Unicode\p{L} che descrive i caratteri Unicode che sono lettere.


119
Questa è una soluzione molto incentrata su ASCII. Ciò interromperà praticamente qualsiasi testo non inglese.
Joachim Sauer,

7
@Joachim Sauer: si romperà piuttosto le lingue usando caratteri non latini.
Gumbo,

15
Già interrompe il 90% del testo tedesco, nemmeno menzionare il francese o lo spagnolo. L'italiano potrebbe comunque fare abbastanza bene.
Ivo Wetzel,

9
dipende dalla definizione di "carattere latino" che scegli. J, U, Ö, Ä possono essere tutti considerati caratteri latini o meno, in base alla tua definizione. Ma sono tutti usati nelle lingue che usano l'alfabeto latino per la scrittura.
Joachim Sauer,

9
\ p {L} corrisponde a tutti gli accenti di seduzione di umlaut ecc., quindi dovresti andare con quello.
Radu Simionescu,

198

\p{L} corrisponde a tutto ciò che è una lettera Unicode se sei interessato ad alfabeti oltre a quello latino


2
non in tutti i gusti regex. Ad esempio, le regex vim trattano \pcome "carattere stampabile".
Philip Potter,

3
questa pagina suggerisce solo il supporto di regex java, .net, perl, jgsoft, XML e XPath \ p {L}. Ma omissioni importanti: python e ruby ​​(sebbene python abbia il modulo regex).
Philip Potter,

6
@Philip Potter: Ruby supporta le proprietà dei caratteri Unicode usando esattamente la stessa sintassi.
Jörg W Mittag,

6
Penso che questo dovrebbe \p{L}\p{M}*+riguardare lettere composte da più punti di codice, ad esempio una lettera seguita da segni di accento. Come da regular-expressions.info/unicode.html
ZoFreX

con Python 3 questo produce un errorebad escape \p at position 0
matanster

46

A seconda del significato di "personaggio":

[A-Za-z]- tutte le lettere (maiuscole e minuscole)

[^0-9] - tutti i caratteri non numerici


Intendevo letture. Tuttavia, non sembra funzionare. preg_match ('/ [a-zA-Z] + /', $ name);
Nike

[A-Za-z] è solo la dichiarazione di caratteri che puoi usare. Devi ancora dichiarare quante volte questa dichiarazione deve essere utilizzata: [A-Za-z] {1,2} (per abbinare 1 o 2 lettere) o [A-Za-z] {1, *} (per abbinare 1 o più lettere)
KristofMols,

17
beh, á, ã, Ö, Ä ... sono anche lettere, così come অ, আ, ই, ঈ, Є, Ж, З, ﺡ, ﺥ, ﺩ א, ב, ג, ש, ת, ... en.wikipedia.org/wiki/Letter_%28alphabet%29
phuclv

@phuclv: In effetti, ma ciò dipende dalla codifica e la codifica fa parte delle impostazioni del programma (o la configurazione predefinita o quella dichiarata in un file di configurazione del programma). Quando ho lavorato su lingue diverse, l'ho usato per archiviarlo in una costante, in un file di configurazione.
Catalina Chircu,

1
La codifica @CatalinaChircu è assolutamente irrilevante qui. La codifica è un modo per codificare un punto di codice in un set di caratteri in binario, ad esempio UTF-8 è una codifica per Unicode. Le lettere OTOH dipendono dalla lingua, e se uno dice che le [A-Za-z]lettere devono essere specificate la lingua che viene utilizzata
phuclv

32

L'opzione più vicina disponibile è

[\u\l]+

che corrisponde a una sequenza di lettere maiuscole e minuscole. Tuttavia, non è supportato da tutti gli editor / lingue, quindi è probabilmente più sicuro da usare

[a-zA-Z]+

come suggeriscono altri utenti


1
Tuttavia, non corrisponderà a nessun personaggio speciale.
Nyerguds,

20

Useresti

/[a-z]/gi

[] - verifica la presenza di caratteri tra determinati input

az --- copre l'intero alfabeto

g ----- a livello globale su tutta la stringa

i ----- ottenere maiuscole e minuscole


14

L'espressione regolare che poche persone hanno scritto come "/ ^ [a-zA-Z] $ / i" non è corretta perché alla fine hanno menzionato / i che non fa distinzione tra maiuscole e minuscole e dopo la corrispondenza per la prima volta tornerà indietro. Invece di / io uso solo / g che è per global e non hai nemmeno bisogno di mettere ^ $ per iniziare e finire.

/[a-zA-Z]+/g
  1. [a-z _] + corrisponde a un singolo carattere presente nell'elenco seguente
  2. Quantificatore: + Tra uno e un numero illimitato di volte, il maggior numero di volte possibile, restituendo se necessario
  3. az un singolo carattere nell'intervallo tra a e z (case sensitive)
  4. AZ un singolo carattere nell'intervallo tra A e Z (case sensitive)
  5. modificatore g : globale. Tutte le partite (non tornare alla prima partita)

13

Giava:

String s= "abcdef";

if(s.matches("[a-zA-Z]+")){
     System.out.println("string only contains letters");
}

4
non include segni diacritici comeŹŻŚĄ
karoluS



7

Usa gruppi di personaggi

\D

Corrisponde a qualsiasi carattere tranne le cifre 0-9

^\D+$

Vedi esempio qui


8
Questo corrisponderà anche a spazi bianchi, simboli, ecc. Che non sembrano essere la domanda che si pone.
DaveMongoose,

Strano. Ho appena avuto un voto negativo su questo, e non sono io!
Dave Everitt,

6

Basta usare \wo [:alpha:]. Si tratta di sequenze di escape che corrispondono solo a simboli che potrebbero apparire in parole.


9
\wpotrebbe non essere una buona soluzione in tutti i casi. Almeno in PCRE, \wpuò abbinare anche altri personaggi. Citando il manuale di PHP : " Un carattere" parola "è qualsiasi lettera o cifra o il carattere di sottolineatura, ovvero qualsiasi carattere che può far parte di una" parola "Perl. La definizione di lettere e cifre è controllata dalle tabelle dei caratteri di PCRE, e può variare se si verifica una corrispondenza specifica della locale. Ad esempio, nella locale "fr" (francese), alcuni codici di carattere superiori a 128 vengono utilizzati per le lettere accentate e questi sono associati a \ w. ".
Amal Murali,

le parole includono altri caratteri delle lettere
V-SHY,

2
\wsignifica lettere e numeri corrispondenti
Eugen Konkov,

4

Se intendi lettere in qualsiasi codifica di caratteri, un buon approccio potrebbe essere quello di eliminare le lettere non come spazi \s, cifre \de altri caratteri speciali come:

[!@#\$%\^&\*\(\)\[\]:;'",\. ...more special chars... ]

O usa la negazione della negazione sopra per descrivere direttamente qualsiasi lettera:

\S \D and [^  ..special chars..]

Professionisti:

  • Funziona con tutti i sapori regex.
  • Facile da scrivere, a volte consente di risparmiare molto tempo.

Contro:

  • Lunga, a volte non perfetta, ma anche la codifica dei caratteri può essere interrotta.

4

Puoi provare questa espressione regolare: [^\W\d_]o [a-zA-Z].


Questo non è ciò che [^\W|\d]significa
OGHaza il

1
[^\W|\d]significa non \We non |e non \d. Ha lo stesso effetto netto poiché |fa parte di \Wma |non funziona come pensi. Anche allora ciò significa che accetta il _personaggio. Probabilmente stai cercando[^\W\d_]
OGHaza il

Sono d'accordo con te, accetta il _. Ma "NOT" |è uguale a "AND", quindi [^\W|\d]significa: NOT \W AND NOT\d
Motlab,

12
[^ab]significa no ae no b. [^a|b]significa no ae no| e non b. Per dare un secondo esempio [a|b|c|d]è esattamente lo stesso [abcd|||]che è esattamente la stessa [abcd|]- che equivale a ([a]|[b]|[c]|[d]|[|])l' |è un carattere letterale, non un operatore OR. L'operatore OR è implicito tra ogni personaggio in una classe di caratteri, mettendo un vero |mezzo che vuoi che la classe accetti il ​​carattere |(pipe).
OGHaza,

1

Ultimamente ho usato questo modello nei miei moduli per controllare i nomi delle persone, contenenti lettere, spazi vuoti e caratteri speciali come segni di accento.

pattern="[A-zÀ-ú\s]+"

Dovresti dare un'occhiata a una tabella ASCII. A-zcorrisponde più di una semplice lettera e ancheÀ-ú
Toto l'

0

modello = / [a-zA-Z] /

mette "[a-zA-Z]: # {pattern.match (" mine blossom ")}" OK

mette "[a-zA-Z]: # {pattern.match (" 456 ")}"

mette "[a-zA-Z]: # {pattern.match (" ")}"

mette "[a-zA-Z]: # {pattern.match (" # $% ^ & * ")}"

mette "[a-zA-Z]: # {pattern.match (" # $% ^ & * A ")}" OK


3
E che dire, ad esempio, "Zażółć gęslą jaźń"?
Il testimone il

-2
Pattern pattern = Pattern.compile("^[a-zA-Z]+$");

if (pattern.matcher("a").find()) {

   ...do something ......
}
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.