2017-04-19 84 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

相關問題