Regular expression for checking if capital letters are found consecutively in a string?
我想知道以下情况的regexp:
字符串只能包含字母。它必须以大写字母开头,后跟小写字母。然后可以是小写字母或大写字母。
1 | ^[A-Z][a-z][A-Za-z]*$ |
但字符串也不能包含任何连续的大写字母。如何将该逻辑添加到regexp中?
也就是说,
每当写入
Unicode有三种情况,而不是两种情况。此外,您还拥有无偏差的信件。一般来说,字母是由
你可以对其中任何一个进行补充,但要小心,因为像
对于大写字母或标题字母,使用
1 | ^([\p{Lu}\p{Lt}]\p{Ll}+)+$ |
如果您不打算将字母限制在第一个字母之后,而仅限于大小写字母,那么您可能更喜欢:
1 | ^([\p{Lu}\p{Lt}][\p{Ll}\p{Lm}\p{Lo}]+)+$ |
如果您试图匹配所谓的"camelcase"标识符,那么实际规则取决于编程语言,但通常包括下划线字符和十进制数字(
1 | ^([_\p{Lu}\p{Lt}][_\p{Nd}\p{Ll}\p{Lm}\p{Lo}]+)+$ |
但是,如果您处理的是来自不同RFC和ISO标准的某些单词,则通常只指定这些单词包含ASCII。如果是这样的话,你就可以接受字面上的
编辑: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]'; |