Regex pour correspondre uniquement aux lettres


376

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


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.


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


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


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


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


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)

13

Java:

String s= "abcdef";

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

4
il n'inclut pas les signes diacritiques tels queŹŻŚĄ
karoluS



7

Utiliser des groupes de caractères

\D

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

^\D+$

Voir l'exemple ici


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.


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.

4

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


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]+"

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


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 ......
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.