2010-10-29 13 views
35

Quiero saber la expresión regular para el siguiente caso:Expresión regular para verificar si las letras mayúsculas se encuentran consecutivamente en una cadena?

La secuencia debe contener solo letras alfabéticas. Debe comenzar con una letra mayúscula seguida de una letra minúscula. Entonces puede ser letras pequeñas o mayúsculas.

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

Pero la cadena tampoco debe contener mayúsculas consecutivas. ¿Cómo agrego esa lógica a la expresión regular?

Es decir, HttpHandler es correcto, pero HTTPHandler es incorrecto.

Respuesta

23

corregir: 2015-10-26: gracias por los votos a favor, pero eche un vistazo a la respuesta de Tchrist. (uno a continuación) especialmente si se desarrolla para la web o algo más "internacional".

Oren Trutners respuesta no es del todo bien (véase la entrada de la muestra de "RightHerE" que debe ser igualada, pero no lo es)

Aquí está la solución correcta:

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

edición:

(?!^.*[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 

/editar

la clave para la solución es una búsqueda negativa hacia delante se e: http://www.regular-expressions.info/lookaround.html

+0

wat? ! . etc significa? – kiki

+0

es un lookahead negativo - ver mi enlace publicado para una explicación detallada. Básicamente dice que si la expresión regular entre el lookahead negativo coincide, la expresión completa no se corresponde. por lo que puede, por ejemplo, decir:^[0-9] $ (haga coincidir un número del 0 al 9. y puede decir (?!^3 $)^[0-9] $ (haga coincidir un número del 0 al 9, excepto 3). –

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

Esto busca secuencias de una letra mayúscula seguida de una o más letras minúsculas. Las letras consecutivas en mayúscula no coincidirán, ya que solo se permite una a la vez, y debe ir seguida de una minúscula.

+0

Pls excuse my ignorance. Ver, esta es mi expresión regular a partir de ahora: (^ [A-Z] [a-z] [A-Za-z] * $) | (^ I [A-Z] [a-z] [A-Za-z] * $). En esto, tengo que agregar la lógica para verificar que las letras mayúsculas no se combinen en la porción [A-Za-z]. ¿Qué sugieres? ¿Y qué significa + exactamente? – kiki

+0

Esto no coincidirá con el TestX válido ya que no coincidirá con la letra mayúscula final – Falco

101

Cada vez que se escribe [A-Z] o [a-z], se compromete a procesar nada más que datos ASCII de 7 bits. Si eso está realmente bien, está bien. Pero si no lo es, las propiedades Unicode existen para ayudar con esto.

Hay tres casos en Unicode, no dos. Además, también tienes letras no encadenadas. Letras en general son especificados por la propiedad \pL, y cada una de ellas también pertenece a exactamente una de las cinco subcategorías:

  1. letras mayúsculas, especificados con \p{Lu}; por ejemplo: AÇDZÞΣSSὩΙST
  2. letras del título, especificado con \p{Lt}; por ejemplo: LjDzSsᾩSt (en realidad Ss y St son una mayúsculas y luego una letra minúscula, pero ellos son lo que se obtiene si se le pregunta por el TitleCase de ß y , respectivamente)
  3. letras minúsculas, especificado con \p{Ll}; por ejemplo: aαçdzςσþßᾡſt
  4. letras modificadoras, especificadas con \p{Lm}; por ejemplo: ʰʲᴴᴭʺˈˠᵠꜞ
  5. otras letras, especificadas con \p{Lo}; por ejemplo: ƻאᎯᚦ京

Usted puede toma el complemento de cualquiera de ellos, pero tenga cuidado, porque algo así como \P{Lu} hace no significa una letra que no está en mayúsculas. Significa cualquier personaje que no sea una letra mayúscula.

Para la letra mayúscula o de título, use [\p{Lu}\p{Lt}].Así que se podría utilizar para su patrón:

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

Si aquellos que no te refieres a limitar las letras que siguen al primero en las letras de la carcasa solo, entonces es posible que prefiera:

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

Si' Al tratar de hacer coincidir los denominados identificadores "CamelCase", las reglas reales dependen del lenguaje de programación, pero generalmente incluyen el carácter de subrayado y los números decimales (\p{Nd}), y pueden incluir un signo de dólar literal. Si esto es así, es posible que desee agregar algunos de estos a una u otra de las dos clases de caracteres anteriores. Por ejemplo, puede que desee añadir subrayado a ambos, pero sólo números al segundo, dejándole con:

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

Si, sin embargo, se trata de ciertas palabras de varias RFC y los estándares ISO, éstos a menudo se especifican como que contiene ASCII solamente. Si es así, puede salir adelante con la idea literal de [A-Z]. Simplemente no es amable imponer esa restricción si realmente no existe.

+0

Totalmente de acuerdo con la restricción. Aquí hay un poco más de información sobre esto: [Regular-expressions.info] (http://www.regular-expressions.info/unicode.html). – Daneo

+1

En caso de que quiera usar 're' en python, debe saber que no admite la propiedad de caracteres Unicode. http://pypi.python.org/pypi/regex hace. – noisy

+3

Espera un segundo, hay personas que ** no ** usan Perl para regexen? – hd1

3

Aparte de tchrists excelente post en relación con Unicode, creo que no es necesario la solución del complejo con una búsqueda negativa hacia delante ... Su definición requiere un mayúsculas letras seguido por al menos un grupo de (a minúsculas carta opcionalmente seguido de una letra mayúscula-)

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

Sólo un poco más compacto y más fácil de leer que pienso ...

-6

Si desea obtener toda nombre del empleado en MySQL, que tiene al menos una mayúscula carta que aplicar esta consulta.

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