¿Expresión regular para comprobar si las letras mayúsculas se encuentran consecutivamente en una cadena?


Quiero saber la expresión regular para el siguiente caso:

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

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

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

Es decir, HttpHandler es correcto, pero HTTPHandler está equivocado.

Author: Scarabee, 2010-10-29

5 answers

Editar: 2015-10-26: gracias por los votos positivos, pero echa un vistazo a la respuesta de tchrist. (uno más abajo) especialmente si se desarrolla para la web o algo más "internacional".

La respuesta de Oren Trutners no es del todo correcta (consulte la entrada de ejemplo de "RightHerE" que debe coincidir pero no lo es)

Aquí está la solución correcta:

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

Editar:

(?!^.*[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 un lookahead negativo ver: http://www.regular-expressions.info/lookaround.html

 28
Author: Stephan Schinkel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-26 14:25:14

Cada vez que uno escribe [A-Z] o [a-z], uno se compromete a procesar nada más que datos ASCII de 7 bits. Si eso está bien, entonces 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 tiene cartas sin guion. Las letras en general se especifican por la propiedad \pL, y cada una de ellas también pertenece exactamente a una de las cinco subcategorías:

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

Usted puede tomar el complemento de cualquiera de estos, pero tenga cuidado, porque algo como \P{Lu} hace no significa una letra que no es mayúscula. Significa cualquier carácter que no sea una letra mayúscula.

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

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

Si no quiere limitar las letras que siguen a la primera solo a las letras de la carcasa, entonces puede preferir:

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

Si está tratando de hacer coincidir los llamados identificadores "camelCase", entonces 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, es posible que desee agregar guiones bajos a ambos pero solo dígitos al segundo, dejándolo con:

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

Si, sin embargo, está tratando con ciertas palabras de varios RFC y estándares ISO, a menudo se especifican como que contienen ASCII solamente. Si es así, puedes arreglártelas con la idea literal [A-Z]. Simplemente no es amable imponer esa restricción si en realidad no existe.

 114
Author: tchrist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-29 13:27:42
^([A-Z][a-z]+)+$

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

 9
Author: Oren Trutner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-29 08:59:58

Aparte de tchrists excelente post sobre unicode, creo que usted no necesita la solución compleja con una mirada negativa... Su definición requiere una letra mayúscula seguida de al menos un grupo de (una letra minúscula opcionalmente seguida 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
$

Creo que es un poco más compacto y más fácil de leer...

 3
Author: Falco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-06 10:29:40

Si desea obtener todos los nombres de los empleados en mysql que tienen al menos una letra mayúscula que aplicar esta consulta.

SELECT * FROM registration WHERE `name` REGEXP BINARY '[A-Z]';
 -7
Author: Gaurav Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-11 17:53:57