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

Je veux connaître le regexp pour le cas suivant:

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

^[AZ][az][A-Za-z]*$ 

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

HttpHandler est correct, mais HTTPHandler est faux.

edit: 2015-10-26: merci pour les commentaires – mais jetez un coup d’oeil à la réponse de tchrist. (un ci-dessous) surtout si vous développez pour le web ou quelque chose de plus “international”.

La réponse d’Oren Trutners n’est pas tout à fait correcte (voir l’exemple d’entrée de “RightHerE” qui doit être associé mais qui ne l’est pas)

Voici la solution correcte:

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

modifier:

 (?!^.*[AZ]{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 une parsing négative: http://www.regular-expressions.info/lookaround.html

Chaque fois que l’on écrit [AZ] ou [az] , on s’engage à ne traiter que des données ASCII 7 bits. Si c’est vraiment correct, alors ça va. Mais si ce n’est pas le cas, les propriétés Unicode existent pour vous aider.

Il y a trois cas dans Unicode, pas deux. De plus, vous avez également des lettres non classées. 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. majuscules , spécifiées par \p{Lu} ; ex: AÇDZÞΣSSὩΙST
  2. les lettres de titlecase , spécifiées par \p{Lt} ; Par exemple: LjDzSsᾩSt (en réalité, Ss et St sont des lettres majuscules puis minuscules, mais elles sont ce que vous obtenez si vous demandez le titlecase de ß et , respectivement)
  3. lettres minuscules , spécifiées avec \p{Ll} ; par exemple: aαçdzςσþßᾡſt
  4. lettres de modification , spécifiées avec \p{Lm} ; par exemple: ʰʲᴴᴭʺˈˠᵠꜞ
  5. autres lettres , spécifiées par \p{Lo} ; par exemple: ƻאᎯᚦ京

Vous pouvez prendre le complément de n’importe lequel de ces éléments, mais soyez prudent car quelque chose comme \P{Lu} ne signifie pas 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 minuscules, utilisez [\p{Lu}\p{Lt}] . Donc, vous pourriez utiliser pour votre modèle:

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

Si ceux que vous ne voulez pas limiter aux lettres qui suivent le premier ne sont que les lettres de casing, alors vous préférerez peut-être:

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

Si vous essayez de faire correspondre des identificateurs “CamelCase”, les règles réelles dépendent du langage de programmation, mais incluent généralement le caractère de soulignement et les nombres décimaux ( \p{Nd} ), et peut inclure un signe littéral. . Si tel est le cas, vous souhaiterez peut-être en append à l’une ou l’autre des deux classes de caractères ci-dessus. Par exemple, vous souhaiterez peut-être append un trait de soulignement aux deux caractères, mais uniquement des chiffres au second, vous laissant avec:

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

Si, cependant, vous avez affaire à certains mots de différentes normes RFC et ISO, celles-ci sont souvent spécifiées comme contenant uniquement des caractères ASCII. Si c’est le cas, vous pouvez vous en sortir avec l’idée littérale [AZ] . Ce n’est pas gentil d’imposer cette ressortingction si elle n’existe pas réellement.

 ^([AZ][az]+)+$ 

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

Mis à part l’excellent post des tchrists concernant unicode, je pense que vous n’avez pas besoin de la solution complexe avec un lookahead négatif … Votre définition nécessite une lettre majuscule suivie d’au moins un groupe de (une lettre minuscule éventuellement suivie d’une lettre majuscule )

 ^ [AZ] // Start with an uppercase Letter ( // A Group of: [az] // mandatory lowercase letter [AZ]? // 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 …

Si vous voulez obtenir tous les noms d’employés dans mysql qui ont au moins une lettre majuscule, appliquez cette requête.

 SELECT * FROM registration WHERE `name` REGEXP BINARY '[AZ]';