2011-11-10 97 views
4

如何使用正則表達式匹配所有大寫字母的一個或多個單詞組?PHP正則表達式匹配所有大寫字母的單詞或字組

我相信我已經解決了問題的一半,雖然它可能不是正確的方法。

我想抓住所有大寫或兩個或三個單詞中的一個單詞 - 基本上,如果它們繼承我希望它們作爲一個組捕獲,而不是每個單詞本身。

例如爲:
「HAPPY BIRTHDAY TOMMY」 將不匹配,並返回[0] -> HAPPY, [1] -> BIRTHDAY, [2] -> TOMMY,但整個集團,如[0] -> HAPPY BIRTHDAY TOMMY

我在下面使用的代碼將「HAPPY BIRTHDAY」放在一起,或者只是「TOMMY」,但不是所有的東西放在一起。

[A-Z]{1,}\s[A-Z]{1,}|\b[A-Z]{1,}\b 

回答

5

您可以使用正則表達式:

(?=[A-Z])([A-Z\s]+) 

See it

+0

這確實挑起了尾隨的空白,但這可能是也可能不是問題。 –

+0

@ muistooshort:你是對的..這個修復:http://www.ideone.com/QVLXv – codaddict

+0

僅供將來參考,忽略空白使用以下正則表達式: (?= [A-Z])([A-Z] +) – madc

1

我確定我完全理解你需要什麼,但爲了組,你必須使用括號()。試試這個:

([A-Z]+)\b([A-Z]+)\b([A-Z]+)\b 

這應該捕獲三個連續的全部大寫單詞。

+0

您不匹配單詞之間的空格。單詞邊界不匹配它們。 – stema

+0

組零始終是表達式的完全匹配。對於HAPPY BIRTHDAY TOMMY,它會返回[0] => HAPPY BIRTHDAY TOMMY [1] => HAPPY [2] => BIRTHDAY [3] => TOMMY –

+0

@stema - 在Ryan的帖子中看到預期的結果,不被捕獲。 –

1

如果我理解正確的話,這應該做的伎倆/([A-Z]\s?)+/。這應該捕捉到像HAPPY BIRTHDAY TOMMY這樣的序列和HAPPY BIRTHDAY tommy BOY兩個序列('HAPPY BIRTHDAY'和'BOY')。

+0

這將捕獲一個句子中的所有大寫字母請參閱[它在正則表達式](http://regexr.com?2v5gm) – stema

1

什麼有關此

$str = "My test sentence HAPPY BIRTHDAY TOMMY this is lower case an UPPERCASE more lowercase"; 
if (preg_match_all('/\\b(?=[A-Z])[A-Z ]+(?=\\W)/',$str,$match)) {      
    var_dump($match[0]); 
} 

結果是

陣列(2){[0] =>串(20) 「生日快樂TOMMY」 1 =>串(9)「大寫「}

在末尾使用lookahead確保在末尾沒有包含空白,因爲如果使用了單詞邊界並且存在另一個單詞foll虧欠的。

查看它here on Regexr

相關問題