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


67

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

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

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

但字符串也不得包含任何连续的大写字母。如何将该逻辑添加到正则表达式?

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

Answers:


43

编辑: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


at呢?!。等代表?
kiki 2010年

1
这是一个负面的前瞻-请参阅我发布的链接以获取详细说明。基本上它说,如果负前瞻之间的正则表达式匹配,则整个表达式不匹配。因此您可以说:^ [0-9] $(匹配0到9之间的一个数字,并且您可以说(?!^ 3 $)^ [0-9] $(匹配0到9之间的一个数字, 3)
斯蒂芬·辛克尔

158

只要有人写[A-Z][a-z],就承诺只处理7位ASCII数据。如果真的可以,那就很好。但是,如果不是这样,则存在Unicode属性可以帮助实现这一点。

Unicode中有三种情况,而不是两种。此外,您也有非大小写字母。通常,字母由\pL属性指定,并且每个字母也恰好属于五个子类别之一:

  1. 大写字母,用指定\p{Lu}; 例如:AÇDZÞΣSSὩΙST
  2. 标题字母,用指定\p{Lt}; 如:LjDzSsᾨSt (实际上SsSt是一个大写,然后一个小写字母,但他们你会得到什么,如果你问的首字母大写 ß,并分别)
  3. 小写字母,用\p{Ll}; 例如:aαçdzςσþßᾡſt
  4. 修饰语字母,用\p{Lm}; 例如:ʰʲᴴᴭʺˈˠᵠꜞ
  5. 其他字母,注明\p{Lo}; 例如:ƻאᎯᚦ京

可以采取任何这些补充,但要小心,因为像\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]。如果该限制实际上不存在,则施加这种限制是不好的。


完全同意有关限制。这是有关此的更多信息:Regular-expressions.info
Daneo,2012年

1
如果要re在python中使用,则必须知道它不支持Unicode字符属性。pypi.python.org/pypi/regex可以。
2013年

6
稍等一下,有些人使用perl做regexen吗?
2013年

您的Ὡ不被perl识别为大写字母,请使用此欧米茄-Ω:-) :-P
Bogdan Mart

1
@Ryan确实取决于您的要求-您的Regex仅允许“大写AZ和数字0-9”,并且第一个字符不能为数字。-但是,例如,如果您的要求是“任何大写字母(任何语言)和任何数字(不仅0-9,还可以是任何语言)-那么您可以使用以下代码:[\p{Lu}\p{Lt}][\p{Lu}\p{Nd}]+
Falco

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

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


请原谅我的无知。瞧,这是我到目前为止的正则表达式:(^ [AZ] [az] [A-Za-z] * $)|(^ I [AZ] [az] [A-Za-z] * $)。为此,我必须添加逻辑来检查[A-Za-z]部分中的大写字母不在一起。你有什么建议?+的确切含义是什么?
kiki 2010年

因为你不会匹配最终大写字母这将不匹配的有效TestX
法尔科

7

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

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

我认为它只是更紧凑,更易于阅读...


-11

如果要在mysql中获取所有雇员名称,且该名称至少具有一个大写字母,则不应用此查询。

SELECT * FROM registration WHERE `name` REGEXP BINARY '[A-Z]';
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.