2010-10-29 11 views
35

Je souhaite connaître l'expression rationnelle pour le cas suivant:Expression régulière pour vérifier si les lettres majuscules sont trouvées consécutivement dans une chaîne?

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 petites lettres ou de majuscules.

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

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

En d'autres termes, HttpHandler est correct, mais HTTPHandler est incorrect.

Répondre

23

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

Oren Trutners réponse n'est pas tout à fait raison (voir entrée d'échantillons de "RightHere" qui doit être adapté mais 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 négatif se préanalyse e: http://www.regular-expressions.info/lookaround.html

+0

wat fait? ! . etc représentent? – kiki

+0

c'est un lookahead négatif - voir mon lien posté pour une explication en profondeur. En gros, il est dit que si la regex entre les lookahead négatifs est appariée, l'expression entière ne correspond pas. donc vous pouvez par exemple dire:^[0-9] $ (faire correspondre un nombre de 0 à 9. et vous pouvez dire (?!^3 $)^[0-9] $ (faire correspondre un nombre de 0 à 9 sauf 3). –

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

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

+0

Pls excusez mon ignorance. Voyez, ceci est mon expression rationnelle dès maintenant: (^ [A-Z] [a-z] [A-Za-z] * $) | (^ I [A-Z] [a-z] [A-Za-z] * $). Dans ce cas, je dois ajouter la logique pour vérifier que les lettres majuscules ne sont pas regroupées dans la partie [A-Za-z]. Que suggérerais-tu? Et qu'est-ce que + signifie exactement? – kiki

+0

Cela ne correspondra pas au TestX valide puisque vous ne correspondrez pas à la lettre majuscule finale – Falco

101

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

Il existe trois cas dans Unicode, pas deux. En outre, vous avez également des lettres non assouplies. Les lettres en général sont spécifiées par la propriété \pL, et chacun d'entre eux appartient aussi exactement l'un des cinq sous-catégories:

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

Vous pouvez prendre le complément de toutes ces choses, mais faites attention, parce que quelque chose comme \P{Lu} ne pas signifie une lettre qui ne sont pas en majuscules. Cela signifie tout caractère qui n'est pas une lettre majuscule. Pour les lettres majuscules ou en titrase, utilisez [\p{Lu}\p{Lt}].Donc, vous pouvez utiliser pour votre modèle:

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

Si ceux que vous ne voulez pas limiter les lettres qui suivent la première aux lettres de boîtier seul, alors vous pourriez préférer:

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

Si vous En essayant de faire correspondre les identifiants dits "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 peuvent inclure un signe dollar littéral. Si tel est le cas, vous pouvez ajouter certains d'entre eux à l'une ou l'autre des deux classes de caractères ci-dessus. Par exemple, vous pouvez ajouter underscore à la fois, mais les chiffres que dans la seconde, vous laissant avec:

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

Si, cependant, vous avez affaire à certains mots de divers RFCs et les normes ISO, celles-ci sont souvent spécifiées comme contenant uniquement ASCII. Si oui, vous pouvez vous en tirer avec l'idée littérale [A-Z]. Ce n'est pas gentil d'imposer cette restriction si elle n'existe pas.

+0

Totalement d'accord concernant la restriction. Voici un peu plus d'informations à ce sujet: [Regular-expressions.info] (http://www.regular-expressions.info/unicode.html). – Daneo

+1

Si vous voulez utiliser 're' dans python, vous devez savoir qu'il ne supporte pas la propriété de caractère Unicode. http://pypi.python.org/pypi/regex fait. – noisy

+3

Attendez une seconde, il y a des gens qui ** n'utilisent pas ** perl pour regexen? – hd1

3

En dehors de tchrists excellent post au sujet unicode, je pense que vous n'avez pas besoin de la solution complexe avec un négatif ... préanalyse Votre définition exige une Majuscules lettre suivie d'au moins un groupe de (un minuscule lettre éventuellement suivie d'une majuscules lettre)

^ 
[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 ...

-6

Si vous voulez obtenir tous nom de l'employé dans une base MySQL qui ayant au moins une lettre majuscule lettre que d'appliquer cette requête.

SELECT * FROM registration WHERE `name` REGEXP BINARY '[A-Z]';