正则是在字符串中找到第一个或两个大写字母



我正在寻找一条正则是在字符串中找到第一个或两个大写字样。如果前两个单词大写,我想要前两个单词。连字符应视为单词的一部分。

  1. 对于Madonna has a new album,我正在寻找madonna
  2. 对于Paul Young has no new album,我正在寻找Paul Young
  3. 对于Emmerson Lake-palmer is not here,我正在寻找Emmerson Lake-palmer

我一直在使用^[A-Z]+.*?b( [A-Z]+.*?b){0,1},它在前两个方面非常出色,但是对于第三个示例,我获得了Emmerson Lake,而不是Emmerson Lake-palmer

我可以用什么义务在上述示例中找到第一个或两个大写字母?

您可以使用

^[A-Z][-a-zA-Z]*(?:s+[A-Z][-a-zA-Z]*)?

请参阅Regex Demo

基本上,使用字符类[-a-zA-Z]*而不是点匹配模式仅匹配字母和连字符。

详细信息

  • ^-字符串的开始
  • [A-Z]-大写ASCII字母
  • [-a-zA-Z]*-零或更多ASCII字母/连字符
  • (?:s+[A-Z][-a-zA-Z]*)?-可选(由于?量词(的可选序列:
    • s+-1 Whitespace
    • [A-Z]-大写ASCII字母
    • [-a-zA-Z]*-零或更多ASCII字母/连字符

一个Unicode Aware等效(对于支持Unicode属性类的正则风味(:

^p{Lu}[-p{L}]*(?:s+p{Lu}[-p{L}]*)?

p{L}匹配任何字母, p{Lu}匹配任何大写字母。

这可能更简单:

^([A-Z][-A-Za-z]+)(s[A-Z][-A-Za-z]+)?

如果您期望单字母单词,将+替换为*

如果您需要一个全名仅( a两个单词带有第一个大写字母(,这是一个简单的示例:

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

尝试。享受!

相关内容

最新更新