REGEX查找字符串中的第一个或两个大写单词

pat*_*ick 4 regex

我正在寻找一个REGEX来查找字符串中的前一个或两个大写单词.如果前两个单词大写,我想要前两个单词.连字符应被视为单词的一部分.

  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.

在上面的例子中,我可以用什么REGEX来查找前一个或两个大写单词?

Wik*_*żew 6

你可以用

^[A-Z][-a-zA-Z]*(?:\s+[A-Z][-a-zA-Z]*)?
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

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

细节

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

Unicode识别等价物(对于支持Unicode属性类的正则表达式):

^\p{Lu}[-\p{L}]*(?:\s+\p{Lu}[-\p{L}]*)?
Run Code Online (Sandbox Code Playgroud)

其中,\p{L}匹配任何字母和\p{Lu}匹配任何大写字母.