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

时间:2010-10-29 08:54:06

标签: regex capitalize

我想知道以下情况的正则表达式:

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

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

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

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

5 个答案:

答案 0 :(得分:130)

只要有人写[A-Z][a-z],就会提交一个只处理7位ASCII数据的内容。如果那真的没问题,那很好。但如果不是,则存在Unicode属性以帮助解决此问题。

Unicode中有三种情况,而不是两种情况。此外,您还有非公开信。一般来说,信件由\pL属性指定,并且每个属性也属于五个子类别中的一个:

  1. 大写字母,由\p{Lu}指定;例如:AÇDZÞΣSSὩΙST
  2. \p{Lt}指定的
  3. 标题字母;例如:LjDzSsᾩSt (实际上SsSt是一个大写字母,然后是一个小写字母,但如果你要求ß和{的标题,那么它们 你会得到什么分别为{1}}
  4. 小写字母,由\p{Ll}指定;例如:aαçdzςσþßᾡſt
  5. 修饰符字母,使用\p{Lm}指定;例如:ʰʲᴴᴭʺˈˠᵠꜞ
  6. 其他字母,以\p{Lo}指定;例如:ƻאᎯᚦ京
  7. 可以采取其中任何一个的补充,但要小心,因为像\P{Lu}这样的东西意味着一个不是大写的字母。它表示任何不是大写字母的字符。

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

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

    如果您不想将第一个字母限制在套管字母之外,那么您可能更喜欢:

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

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

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

    但是,如果您处理来自各种RFC和ISO标准的某些单词,则通常将这些单词指定为仅包含ASCII。如果是这样,您可以使用文字[A-Z]的想法。如果它实际上不存在,那就强加这种限制是不合适的。

答案 1 :(得分:33)

编辑:2015-10-26:感谢你的赞成 - 但请看看tchrist的回答。 (下面一个)特别是如果您为网络开发或更“国际化”的东西。

Oren Trutners的答案不太正确(参见“RightHerE”的样本输入,必须匹配但不是)

这是正确的解决方案:

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

编辑:

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

答案 2 :(得分:11)

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

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

答案 3 :(得分:4)

除了tchrists关于unicode的优秀帖子,我认为你不需要带有负面前瞻的复杂解决方案...... 您的定义需要一个大写字母后跟至少一组(小写字母后面跟一个大写字母)

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

我认为......更紧凑,更容易阅读...

答案 4 :(得分:-8)

如果你想在mysql中获得至少有一个大写字母而不是应用这个查询的所有Employee名称。

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