在一个字符串中找到第一个或前两个大写字母开头的单词的正则表达式

4
我正在寻找一个用于查找字符串中第一个或前两个大写单词的正则表达式。如果前两个单词是大写的,我想要这两个单词。破折号应该被视为单词的一部分。
以下是需要翻译的内容:
  • 对于“Madonna has a new album”,我要找到“madonna”
  • 对于“Paul Young has no new album”,我要找到“Paul Young”
  • 对于“Emmerson Lake-palmer is not here”,我要找到“Emmerson Lake-palmer”
我一直在使用^[A-Z]+.*?\b( [A-Z]+.*?\b){0,1},在前两个示例上效果很好,但是对于第3个示例,我得到的是Emmerson Lake,而不是Emmerson Lake-palmer
请问有什么正则表达式可以用来找到上述示例中的第一个或前两个大写单词?
3个回答

6
你可以使用。
^[A-Z][-a-zA-Z]*(?:\s+[A-Z][-a-zA-Z]*)?

请查看正则表达式演示

基本上,使用字符类[-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} 匹配任何大写字母。


我已添加了模式说明并更新了演示链接。 - Wiktor Stribiżew
请注意,您还可以通过指定要排除的字符来使字符类反向匹配;例如,[^ ]将匹配任何不是空格的内容。 - ASL

3
这可能更简单:
^([A-Z][-A-Za-z]+)(\s[A-Z][-A-Za-z]+)?

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


这将返回字符串中所有大写字母,而不仅仅是前一两个大写字母。 - patrick

0
如果您需要一个仅包含全名(即首字母大写的两个单词)的示例,请看以下简单示例:
^([A-Z][a-z]*)(\s)([A-Z][a-z]+)$

试一下。享受吧!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接