web-dev-qa-db-fra.com

Expression régulière pour vérifier si les lettres majuscules sont trouvées consécutivement dans une chaîne?

Je veux connaître l'expression rationnelle pour le cas suivant:

La chaîne ne doit contenir que des lettres alphabétiques. Il doit commencer par une lettre majuscule suivie d'une lettre minuscule. Ensuite, il peut s'agir de lettres minuscules ou majuscules.

^[A-Z][a-z][A-Za-z]*$

Mais la chaîne ne doit pas non plus contenir de lettres majuscules consécutives. Comment puis-je ajouter cette logique à l'expression rationnelle?

C'est-à-dire que HttpHandler est correct, mais HTTPHandler est erroné.

61
kiki

Edit: 2015-10-26: merci pour les votes positifs - mais jetez un oeil à réponse de tchrist , surtout si vous développez pour le Web ou quelque chose de plus "international".

Oren Trutners répond que ce n'est pas tout à fait correct (voir l'exemple de "RightHerE" qui doit être comparé mais ne l'est pas)

Voici la solution correcte:

(?!^.*[A-Z]{2,}.*$)^[A-Za-z]*$

modifier:

(?!^.*[A-Z]{2,}.*$)  // don't match the whole expression if there are two or more consecutive uppercase letters
^[A-Za-z]*$          // match uppercase and lowercase letters

/modifier

la clé de la solution est un lookahead négatif, voir: http://www.regular-expressions.info/lookaround.html

37
Stephan Schinkel

Chaque fois que l'on écrit [A-Z] Ou [a-z], On s'engage à ne traiter que des données à 7 bits ASCII. Si ça va vraiment, alors d'accord. Mais si ce n'est pas le cas, les propriétés Unicode existent pour vous aider.

Il y a trois cas en Unicode, pas deux. En outre, vous avez également des lettres sans casse. Les lettres en général sont spécifiées par la propriété \pL, Et chacune d'entre elles appartient également à l'une des cinq sous-catégories suivantes:

  1. lettres majuscules, spécifié avec \p{Lu}; Par exemple: AÇDZÞΣSSὩΙST
  2. lettres majuscules, spécifié avec \p{Lt}; Par exemple: LjDzSsᾨSt (en réalité Ss et St sont une lettre majuscule puis minuscule, mais ils sont ce que vous obtenez si vous demandez les titres de ß et , respectivement)
  3. lettres minuscules, spécifié avec \p{Ll}; Par exemple: aαçdzςσþßᾡſt
  4. lettres de modification, spécifié avec \p{Lm}; Par exemple: ʰʲᴴᴭʺˈˠᵠꜞ
  5. autres lettres, spécifié avec \p{Lo}; Par exemple: ƻאᎯᚦ京

Vous pouvez prendre le complément de l’un d’entre eux, mais soyez prudent, car quelque chose comme \P{Lu} Le fait pas signifie une lettre qui n’est pas en majuscule. Cela signifie n'importe quel caractère qui n'est pas une lettre majuscule.

Pour les lettres majuscules ou majuscules, utilisez [\p{Lu}\p{Lt}]. Donc, vous pouvez utiliser pour votre modèle:

      ^([\p{Lu}\p{Lt}]\p{Ll}+)+$

Si vous ne voulez pas limiter les lettres qui suivent les premières aux seules lettres de casse, vous préférerez peut-être:

     ^([\p{Lu}\p{Lt}][\p{Ll}\p{Lm}\p{Lo}]+)+$

Si vous essayez de faire correspondre les identifiants dits "CamelCase", les règles réelles dépendent du langage de programmation, mais comprennent généralement le caractère de soulignement et les nombres décimaux (\p{Nd}), Et peuvent inclure un dollar littéral. signe. Si tel est le cas, vous voudrez peut-être en ajouter une à l'une ou l'autre des deux classes de caractères ci-dessus. Par exemple, vous voudrez peut-être ajouter un trait de soulignement à la fois, mais des chiffres à la seconde, en vous laissant avec:

     ^([_\p{Lu}\p{Lt}][_\p{Nd}\p{Ll}\p{Lm}\p{Lo}]+)+$

Si, toutefois, vous avez affaire à certains mots de différents RFC et normes ISO, ceux-ci sont souvent spécifiés comme contenant uniquement ASCII. Si c'est le cas, vous pouvez vous en tirer avec l'idée littérale [A-Z]. Ce n'est simplement pas aimable d'imposer cette restriction si elle n'existe pas réellement.

141
tchrist
^([A-Z][a-z]+)+$

Ceci recherche les séquences d'une lettre majuscule suivie d'une ou plusieurs lettres minuscules. Les lettres majuscules consécutives ne correspondront pas, car une seule est autorisée à la fois et elle doit être suivie d'une lettre minuscule.

12
Oren Trutner

Mis à part l'excellent article de tchrist concernant l'unicode, je pense que vous n'avez pas besoin de la solution complexe avec une anticipation négative ... Votre définition nécessite une lettre majuscule suivie d'au moins un groupe de (une lettre minuscule éventuellement suivie d'une lettre majuscule )

^
[A-Z]    // Start with an uppercase Letter
(        // A Group of:
  [a-z]  // mandatory lowercase letter
  [A-Z]? // an optional Uppercase Letter at the end
         // or in between lowercase letters
)+       // This group at least one time
$

Juste un peu plus compact et plus facile à lire, je pense ...

5
Falco