关于regex:用于检查是否在字符串中连续找到大写字母的正则表达式?

Regular expression for checking if capital letters are found consecutively in a string?

我想知道以下情况的regexp:

字符串只能包含字母。它必须以大写字母开头,后跟小写字母。然后可以是小写字母或大写字母。

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

但字符串也不能包含任何连续的大写字母。如何将该逻辑添加到regexp中?

也就是说,HttpHandler是正确的,但HttpHandler是错误的。


每当写入[A-Z][A-Z]时,除了7位ASCII数据外,什么也不处理。如果真的可以,那就好了。但如果不是这样,则存在Unicode属性来帮助实现这一点。

Unicode有三种情况,而不是两种情况。此外,您还拥有无偏差的信件。一般来说,字母是由\pL属性指定的,每个字母也恰好属于五个子类别之一:

  • 大写字母,用\p{Lu}指定;例如:A??TΣSS?ΙST
  • t大写字母,用\p{Lt}表示;例如:??Ss?St表示。(实际上,SsSt是一个大写和小写字母,但如果你分别要求??的标题,它们就是你得到的。)
  • 小写字母,用\p{Ll}指定;例如:aα???σt???
  • 修饰字母,用\p{Lm}表示;例如:?????????表示
  • \p{Lo}一起规定的其他字母;如:????京
  • 你可以对其中任何一个进行补充,但要小心,因为像\p{Lu}这样的东西并不意味着字母不是大写的。它表示任何不是大写字母的字符。

    对于大写字母或标题字母,使用[\p{Lu}\p{Lt}]。所以你可以使用你的模式:

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

    如果您不打算将字母限制在第一个字母之后,而仅限于大小写字母,那么您可能更喜欢:

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

    如果您试图匹配所谓的"camelcase"标识符,那么实际规则取决于编程语言,但通常包括下划线字符和十进制数字(\p{Nd}),并且可能包括文字美元符号。如果是这样,您可能希望将其中一些添加到上面两个字符类中的一个或另一个。例如,您可能希望向这两个部分都添加下划线,但只向第二个部分添加数字,这样您就可以:

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

    但是,如果您处理的是来自不同RFC和ISO标准的某些单词,则通常只指定这些单词包含ASCII。如果是这样的话,你就可以接受字面上的[A-Z]概念。如果这种限制实际上不存在的话,那就不好受了。


    编辑:2015年10月26日:谢谢你的支持——但是看看Tchrist的答案。(以下一个)特别是当你为网络或其他更"国际化"的东西开发的时候。

    Oren Trutners的回答并不完全正确(请参阅"righthere"的示例输入,该输入必须匹配但不匹配)

    以下是正确的解决方案:

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

    编辑:

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

    编辑

    解决方案的关键是否定的前瞻性,请参阅:http://www.regular-expressions.info/lookaround.html


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

    这将查找一个大写字母后跟一个或多个小写字母的序列。连续的大写字母将不匹配,因为一次只允许一个,后面必须跟一个小写字母。


    除了tchrists关于unicode的优秀文章之外,我认为您不需要具有负前瞻性的复杂解决方案…您的定义需要一个大写字母后跟至少一组(可选的小写字母后跟一个大写字母)

    1
    2
    3
    4
    5
    6
    7
    8
    ^
    [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
    $

    只是稍微紧凑一点,更容易阅读…


    如果您想在MySQL中获取所有雇员的姓名,并且至少有一个大写字母,那么可以应用此查询。

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