Regex pour correspondre uniquement aux lettres

376

Comment puis-je écrire une expression régulière qui ne correspond qu'à des lettres?

Nike
la source
58
Quelle est votre définition de characters? ASCII? Kanji? ISO-XXXX-X? UTF8?
Ivo Wetzel
45
Quelle est votre définition de regex? Perl? Emacs? Grep?
Pascal Cuoq
4
Étant donné que la question est en anglais, sur un site anglais, il est juste de supposer que la question concerne les caractères en anglais.
vaer-k
1
J'ai remarqué que \ p {L} pour une lettre et / u le drapeau pour l'Unicode correspond à n'importe quelle lettre de mon expression /\p{L}+/u
régulière
4
Given that the question is in English, on an English site, it's fair to assume the question regards characters in English. C'est vrai. Comme nous le savons tous, les anglophones ne localisent JAMAIS leurs applications!
Alex

Réponses:

393

Utilisez un jeu de caractères: [a-zA-Z]correspond à une lettre de A à Z en minuscule et en majuscule. [a-zA-Z]+correspond à une ou plusieurs lettres et ^[a-zA-Z]+$correspond uniquement aux chaînes composées d'une ou plusieurs lettres ( ^et $marque respectivement le début et la fin d'une chaîne).

Si vous voulez faire correspondre les autres lettres que A-Z, vous pouvez les ajouter au jeu de caractères: [a-zA-ZäöüßÄÖÜ]. Ou vous utilisez des classes de caractères prédéfinies comme la classe de propriétés de caractère Unicode\p{L} qui décrit les caractères Unicode qui sont des lettres.

Gombo
la source
119
C'est une solution très ASCII. Cela cassera à peu près n'importe quel texte non anglais.
Joachim Sauer
7
@Joachim Sauer: Cela va plutôt casser sur les langues utilisant des caractères non latins.
Gumbo
15
Déjà des pauses sur 90% du texte allemand, ne mentionnez même pas le français ou l'espagnol. L'italien pourrait quand même bien se débrouiller.
Ivo Wetzel
9
cela dépend de la définition de "caractère latin" que vous choisissez. J, U, Ö, Ä peuvent tous être considérés comme des caractères latins ou non, en fonction de votre définition. Mais ils sont tous utilisés dans des langues qui utilisent "l'alphabet latin" pour écrire.
Joachim Sauer
9
\ p {L} correspond à tous les accents de trémas, etc., donc vous devriez y aller.
Radu Simionescu
198

\p{L} correspond à tout ce qui est une lettre Unicode si vous êtes intéressé par des alphabets au-delà du latin

RobV
la source
2
pas dans toutes les saveurs regex. Par exemple, les expressions régulières vim sont traitées \pcomme des "caractères imprimables".
Philip Potter
3
cette page ne propose que la prise en charge des expressions régulières java, .net, perl, jgsoft, XML et XPath \ p {L}. Mais omissions majeures: python et ruby ​​(bien que python ait le module regex).
Philip Potter
6
@Philip Potter: Ruby prend en charge les propriétés des caractères Unicode en utilisant exactement la même syntaxe.
Jörg W Mittag
6
Je pense que cela devrait être \p{L}\p{M}*+pour couvrir les lettres composées de plusieurs points de code, par exemple une lettre suivie de marques d'accent. Selon regular-expressions.info/unicode.html
ZoFreX
avec python 3, cela donne une erreurbad escape \p at position 0
matanster
46

En fonction de votre signification de "caractère":

[A-Za-z]- toutes les lettres (majuscules et minuscules)

[^0-9] - tous les caractères non numériques

KristofMols
la source
Je voulais dire des locations. Cela ne semble pas fonctionner. preg_match ('/ [a-zA-Z] + /', $ nom);
Nike
[A-Za-z] n'est que la déclaration de caractères que vous pouvez utiliser. Vous devez toujours déclarer combien de fois cette déclaration doit être utilisée: [A-Za-z] {1,2} (pour correspondre à 1 ou 2 lettres) ou [A-Za-z] {1, *} (pour correspondre 1 ou plusieurs lettres)
KristofMols
17
ainsi à, á, ã, Ö, Ä ... sont aussi des lettres, ainsi que অ, আ, ই, ঈ, Є, Ж, З, ﺡ, ﺥ, ﺩ א, ב, ג, ש, ת, ... en.wikipedia.org/wiki/Letter_%28alphabet%29
phuclv
@phuclv: En effet, mais cela dépend de l'encodage, et l'encodage fait partie des paramètres du programme (soit la configuration par défaut, soit celle déclarée dans un fichier de configuration du programme). Lorsque je travaillais sur différentes langues, je les stockais dans une constante, dans un fichier de configuration.
Catalina Chircu
1
L'encodage @CatalinaChircu est absolument hors de propos ici. L'encodage est un moyen d'encoder un point de code dans un jeu de caractères en binaire, par exemple UTF-8 est un encodage pour Unicode. Les lettres OTOH dépendent de la langue, et si l'on dit que ce [A-Za-z]sont des lettres, la langue utilisée doit être spécifiée
phuclv
32

L'option la plus proche disponible est

[\u\l]+

qui correspond à une séquence de lettres majuscules et minuscules. Cependant, il n'est pas pris en charge par tous les éditeurs / langues, il est donc probablement plus sûr d'utiliser

[a-zA-Z]+

comme le suggèrent d'autres utilisateurs

note bleue
la source
1
Ne correspondra cependant à aucun caractère spécial.
Nyerguds
20

Vous utiliseriez

/[a-z]/gi

[] - vérifie tous les caractères entre les entrées données

az --- couvre tout l'alphabet

g ----- globalement sur toute la chaîne

i ----- obtenir des majuscules et des minuscules

Scott
la source
14

L'expression régulière que peu de gens ont écrite comme "/ ^ [a-zA-Z] $ / i" n'est pas correcte car à la fin ils ont mentionné / i qui est insensible à la casse et après avoir correspondu pour la première fois, il reviendra. Au lieu de / i, utilisez simplement / g qui est pour global et vous n'avez pas non plus besoin de mettre ^ $ pour commencer et terminer.

/[a-zA-Z]+/g
  1. [a-z _] + correspond à un seul caractère présent dans la liste ci-dessous
  2. Quantificateur: + Entre une fois et un nombre illimité de fois, autant de fois que possible, en redonnant au besoin
  3. az un seul caractère compris entre a et z (sensible à la casse)
  4. AZ un seul caractère compris entre A et Z (sensible à la casse)
  5. modificateur g : global. Tous les matchs (ne revenez pas au premier match)
Yogesh Chauhan
la source
13

Java:

String s= "abcdef";

if(s.matches("[a-zA-Z]+")){
     System.out.println("string only contains letters");
}
Udeshika Sewwandi
la source
4
il n'inclut pas les signes diacritiques tels queŹŻŚĄ
karoluS
11

Pour PHP, ce qui suit fonctionnera bien

'/^[a-zA-Z]+$/'
Rohit Dubey
la source
7

Utiliser des groupes de caractères

\D

Correspond à n'importe quel caractère sauf les chiffres 0-9

^\D+$

Voir l'exemple ici

Tomáš Nedělka
la source
8
Cela correspondra également aux espaces, symboles, etc., ce qui ne semble pas être ce que la question demande.
DaveMongoose
Bizarre. Je viens de recevoir un downvote à ce sujet, et ce n'est pas moi!
Dave Everitt
6

Utilisez simplement \wou [:alpha:]. Il s'agit d'une séquence d'échappement qui ne correspond qu'à des symboles pouvant apparaître dans les mots.

Agaspher
la source
9
\wpeut ne pas être une bonne solution dans tous les cas. Au moins dans PCRE, \wpeut également correspondre à d'autres caractères. Citant le manuel PHP : " Un" mot "est n'importe quelle lettre ou chiffre ou le caractère de soulignement, c'est-à-dire tout caractère pouvant faire partie d'un" mot "Perl. La définition des lettres et des chiffres est contrôlée par les tables de caractères de PCRE, et peut varier si une correspondance spécifique aux paramètres régionaux a lieu. Par exemple, dans les paramètres régionaux "fr" (français), certains codes de caractères supérieurs à 128 sont utilisés pour les lettres accentuées, et ils sont mis en correspondance par \ w. ".
Amal Murali
les mots incluent d'autres caractères des lettres
V-SHY
2
\wsignifie faire correspondre les lettres et les chiffres
Eugen Konkov
4

Si vous voulez dire des lettres dans n'importe quel codage de caractères, alors une bonne approche pourrait être de supprimer les non-lettres comme les espaces \s, les chiffres \det autres caractères spéciaux comme:

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

Ou utilisez la négation de la négation ci-dessus pour décrire directement les lettres:

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

Avantages:

  • Fonctionne avec toutes les saveurs regex.
  • Facile à écrire, économise parfois beaucoup de temps.

Les inconvénients:

  • Long, parfois pas parfait, mais l'encodage des caractères peut également être rompu.
Sławomir Lenart
la source
4

Vous pouvez essayer cette expression régulière: [^\W\d_]ou [a-zA-Z].

Motlab
la source
Ce n'est pas ce que cela [^\W|\d]signifie
OGHaza
1
[^\W|\d]signifie non \Wet non |et non \d. Il a le même effet net depuis qu'il |fait partie du \Wmais |ne fonctionne pas comme vous le pensez. Même alors, cela signifie qu'il accepte le _personnage. Vous recherchez probablement[^\W\d_]
OGHaza
Je suis d'accord avec vous, il accepte les _. Mais "NON" |est égal à "ET", cela [^\W|\d]signifie donc : NON \W ET NON\d
Motlab
12
[^ab]signifie non aet non b. [^a|b]signifie non aet non |et non b. Pour donner un second exemple [a|b|c|d]est exactement le même que celui [abcd|||]qui est exactement la même que celle [abcd|]- qui assimilent à ([a]|[b]|[c]|[d]|[|])l' |est un caractère littéral, pas un opérateur OR. L'opérateur OR est implicite entre chaque caractère d'une classe de caractères, ce qui |signifie que vous voulez que la classe accepte le caractère |(pipe).
OGHaza
1

Dernièrement, j'ai utilisé ce modèle dans mes formulaires pour vérifier les noms des personnes, contenant des lettres, des blancs et des caractères spéciaux comme des marques d'accent.

pattern="[A-zÀ-ú\s]+"
camilablnpa
la source
Vous devriez avoir regardé une table ASCII. A-zcorrespond à plus que de simples lettres, ainsi queÀ-ú
Toto
0

modèle = / [a-zA-Z] /

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

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

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

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

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

Snm Maurya
la source
3
Et qu'en est-il par exemple de «Zażółć gęslą jaźń»?
Le témoin
-2
Pattern pattern = Pattern.compile("^[a-zA-Z]+$");

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

   ...do something ......
}
Fikreselam Elala
la source