我想知道以下情况的正则表达式:
该字符串应仅包含字母.它必须以大写字母开头,后跟小写字母.然后它可以是小写字母或大写字母.
^[A-Z][a-z][A-Za-z]*$
Run Code Online (Sandbox Code Playgroud)
但字符串也必须不包含任何连续的大写字母.如何将该逻辑添加到正则表达式?
也就是说,HttpHandler是对的,但是HTTPHandler错了.
tch*_*ist 144
每当一个人写[A-Z]或者[a-z],一个人承诺只处理7位ASCII数据.如果那真的没问题,那很好.但如果不是,则存在Unicode属性以帮助解决此问题.
Unicode中有三种情况,而不是两种情况.此外,您还有非公开信.一般来说,信件由\pL属性指定,并且每个字母也属于五个子类别中的一个:
\p{Lu}; 例如:AÇ?Þ?SS??ST\p{Lt}; 如:??Ss?St
(实际上Ss和St是一个大写,然后一个小写字母,但他们是你会得到什么,如果你问的首字母大写 ß,并?分别)\p{Ll}; 例如:a?ç???þß??\p{Lm}; 例如:?????????\p{Lo}; 例如:?????你可以采取任何这些补充,但要小心,因为像\P{Lu}它不意味着不大写了一封信.它表示任何不是大写字母的字符.
对于大写或标题的字母,请使用 [\p{Lu}\p{Lt}].所以你可以使用你的模式:
^([\p{Lu}\p{Lt}]\p{Ll}+)+$
Run Code Online (Sandbox Code Playgroud)
如果您不想将第一个字母限制在套管字母之外,那么您可能更喜欢:
^([\p{Lu}\p{Lt}][\p{Ll}\p{Lm}\p{Lo}]+)+$
Run Code Online (Sandbox Code Playgroud)
如果您尝试匹配所谓的"CamelCase"标识符,那么实际规则取决于编程语言,但通常包括下划线字符和十进制数字(\p{Nd}),并且可能包含文字美元符号.如果是这样,您可能希望将其中一些添加到上面两个字符类中的一个或另一个中.例如,您可能希望将下划线添加到两者,但仅将数字添加到第二个,从而使您:
^([_\p{Lu}\p{Lt}][_\p{Nd}\p{Ll}\p{Lm}\p{Lo}]+)+$
Run Code Online (Sandbox Code Playgroud)
但是,如果您正在处理来自各种RFC和ISO标准的某些单词,则这些单词通常被指定为仅包含ASCII.如果是这样,你可以用文字的[A-Z]想法.如果它实际上不存在,那就强加这种限制是不好的.
Ste*_*kel 38
编辑:2015-10-26:感谢upvotes - 但看看tchrist的回答.(下面一个)特别是如果您为网络开发或更"国际化"的东西.
Oren Trutners的答案不太正确(参见"RightHerE"的样本输入,必须匹配,但不是)
这是正确的解决方案:
(?!^.*[A-Z]{2,}.*$)^[A-Za-z]*$
Run Code Online (Sandbox Code Playgroud)
编辑:
(?!^.*[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
Run Code Online (Sandbox Code Playgroud)
/编辑
解决方案的关键是否定前瞻:http://www.regular-expressions.info/lookaround.html
Ore*_*ner 12
^([A-Z][a-z]+)+$
Run Code Online (Sandbox Code Playgroud)
这将查找大写字母后跟一个或多个小写字母的序列.连续的大写字母将不匹配,因为一次只允许一个,并且必须后跟小写字母.
除了有关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
$
Run Code Online (Sandbox Code Playgroud)
我认为它只是更紧凑,更易于阅读...