2017-04-19 47 views
3

我正在寻找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查找第一个或第二个大写单词?

+0

这些单词总是在输入句子的开头吗? – dotNET

+0

dotNET,是...名称始终在开头 – patrick

回答

5

您可以使用

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

regex demo

基本上,使用一个字符类[-a-zA-Z]*代替点匹配模式只匹配字母和连字符。

详细

  • ^ - 一个大写的ASCII字母
  • [-a-zA-Z]* - - 串
  • [A-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}匹配任何大写字母。

+0

我添加了模式说明并更新了演示链接。详细解释请参阅 –

+0

+1。请注意,您还可以通过指定要排除的字符使字符类以另一种方式工作;例如,'[^]'可以匹配任何不是空格的东西。 – ASL

2

这可能是更简单:

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

更换+*如果你期望的单字母的单词。

+0

这将返回所有大写字母,而不仅仅是字符串中的第一个或第二个大写字母。 – patrick

+1

@帕特里克:改进。 – dotNET

相关问题