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

kik*_*iki 63 regex capitalize

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

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

^[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属性指定,并且每个字母也属于五个子类别中的一个:

  1. 大写字母,指定\p{Lu}; 例如:AÇ?Þ?SS??ST
  2. 标题字母,指定\p{Lt}; 如:??Ss?St (实际上SsSt是一个大写,然后一个小写字母,但他们你会得到什么,如果你问的首字母大写 ß,并?分别)
  3. 小写字母,用\p{Ll}; 例如:a?ç???þß??
  4. 修饰符字母,指定\p{Lm}; 例如:?????????
  5. 其他字母,指定\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]想法.如果它实际上不存在,那就强加这种限制是不好的.

  • 等一下,有人**不用**使用perl进行regexen? (6认同)
  • 如果你想在 python 中使用 `re`,你必须知道它不支持 Unicode 字符属性。http://pypi.python.org/pypi/regex 确实如此。 (3认同)

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

  • 这是一个负面的前瞻 - 请参阅我发布的链接以获取深入的解释。基本上它表示,如果负向先行之间的正则表达式匹配,则整个表达式不匹配。例如,您可以说: ^[0-9]$ (匹配从 0 到 9 的一个数字。您可以说 (?!^3$)^[0-9]$ (匹配从 0 到 9 的一个数字,除了3)。 (2认同)

Ore*_*ner 12

^([A-Z][a-z]+)+$
Run Code Online (Sandbox Code Playgroud)

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


Fal*_*lco 5

除了有关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)

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