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

时间:2017-04-19 14:19:34

标签: regex

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

  1. for Madonna has a new album我正在寻找madonna
  2. for Paul Young has no new album我正在寻找Paul Young
  3. for Emmerson Lake-palmer is not here我正在寻找Emmerson Lake-palmer
  4. 我一直在使用^[A-Z]+.*?\b( [A-Z]+.*?\b){0,1},它在前两个版本中效果很好,但对于第三个示例,我得到的是Emmerson Lake,而不是Emmerson Lake-palmer

    我可以使用哪种REGEX来查找上述示例中的前一个或两个大写单词?

2 个答案:

答案 0 :(得分:6)

您可以使用

^[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]*)? - 一个可选的(1或0由于?量词)序列:
    • \s+ - 1+空格
    • [A-Z] - 一个大写的ASCII字母
    • [-a-zA-Z]* - 零个或多个ASCII字母/连字符

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

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

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

答案 1 :(得分:2)

这可能更简单:

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

如果您希望使用单字母单词,请将+替换为*