我想知道以下情况下的正则表达式:
该字符串应只包含字母。它必须以大写字母开头,后跟小写字母。然后可以是小写字母或大写字母。
^[A-Z][a-z][A-Za-z]*$
但是该字符串也不能包含任何连续的大写字母。我如何将这个逻辑添加到正则表达式中?
也就是说,HttpHandler
正确,而 HTTPHandler
错误。
我想知道以下情况下的正则表达式:
该字符串应只包含字母。它必须以大写字母开头,后跟小写字母。然后可以是小写字母或大写字母。
^[A-Z][a-z][A-Za-z]*$
但是该字符串也不能包含任何连续的大写字母。我如何将这个逻辑添加到正则表达式中?
也就是说,HttpHandler
正确,而 HTTPHandler
错误。
[A-Z]
或[a-z]
时,就明确承诺仅处理来自1960年代的7位ASCII数据。如果这真的可以接受,那么很好。但如果不可接受,则Unicode字符属性可帮助您处理现代字符数据。\pL
属性指定,并且所有这些字母也属于五个子类别之一:\p{Lu}
指定;例如:AÇDZÞΣSSὩΙST
2. 标题大小写字母,由\p{Lt}
指定;例如:LjDzSsᾨSt(实际上Ss
和St
分别是大写和小写字母,但它们确实是ß和ſt的标题大小写形式)
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}]+)+$
如果你正在尝试匹配所谓的“驼峰式”标识符,那么实际规则取决于编程语言,但通常包括下划线字符和十进制数字(\p{Nd}
),并且可能还包括一个字面上的美元符号和其他依赖于语言的字符。如果是这样,您可能希望将其中一种或两种提供的字符类别中的一些添加到其中之一。
例如,您可以希望在两个字符类别中都添加下划线,但仅将数字添加到第二个字符类别中,从而得到: ^([_\p{Lu}\p{Lt}][_\p{Nd}\p{Ll}\p{Lm}\p{Lo}]+)+$
然而,如果你在处理来自各种RFC和ISO标准的特定“单词”,通常会指定这些单词只包含ASCII。 如果是这样,你可以直接使用[A-Z]
表达式,但如果实际上不存在该限制,则不应强加该限制。
(?!^.*[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
/edit
这个问题的关键在于使用负向先行断言。详情请见:先行和后行零宽度断言
^([A-Z][a-z]+)+$
这个正则表达式匹配一个大写字母后跟一个或多个小写字母的序列。连续的大写字母不会匹配,因为每次只允许一个,而且它必须后跟一个小写字母。
^
[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
$
我认为它只是更加紧凑和易于阅读...
SELECT * FROM registration WHERE `name` REGEXP BINARY '[A-Z]';