2016-01-29 97 views
0

我想寫一個正則表達式匹配的值,如U.S.D.C.U.S.A.正則表達式匹配的縮寫

這裏是我迄今爲止 -

\b([a-zA-Z]\.){2,}+ 

注意如何此表達式匹配但不包括首字母縮寫詞中的最後一個字母。

任何人都可以幫助解釋我在這裏失蹤?

enter image description here

SOLUTION

我在這裏張貼的情況下解決這一幫助的人。

\b(?:[a-zA-Z]\.){2,} 

看起來好像在這裏需要一個非捕獲組。

+0

類似'/([A-Za-z] \。)+ /' –

+0

這與我已有的有何不同?我已經添加了字邊界限制以及限制,即首字母縮略詞必須至少包含兩個字母。 – Randy

+0

@ nu11p01n73r,看看我上面的截圖。我認爲這是很好的說明。 – Randy

回答

1

嘗試(?:[a-zA-Z]\.){2,}

?:(非捕獲組)有沒有因爲你要忽略捕捉重複組的最後一個迭代。

例如,沒有?:,'U.S.A'。會產生一個你不感興趣的小組賽A.'。

+0

Leromul,您的答案是正確的,但爲了完整性,我認爲這對我自己和其他人提供解釋會有所幫助爲什麼這個工程與我的解決方案沒有關係。謝謝! – Randy

0

這應該工作:

/([a-zA-Z]\.)+/g 
+0

感謝您的建議,但這實際上並不奏效。由於某種原因,非捕獲組是必需的。 – Randy

+0

這很奇怪。你在使用任何特定的語言(Java,C#等)嗎? – Skaparate

+0

Swift/Objective-C – Randy

1

這些提出的解決方案中沒有做什麼你不 - 確保有在縮寫至少2個字母。此外,你的作品在http://rubular.com/。這可能是正則表達式實現的一些問題 - 公平地說,你得到的所有匹配都是有效的首字母縮略詞。爲了解決這個問題,你既可以:

  • 確保有一個空格或EOF成功的表達(在紅寶石(?=\s|$)至少)
  • 環繞你的正則表達式與^$以確保它捕獲整個字符串。你必須將空格上的整個字符串拆分,才能與此匹配。

我更喜歡前者的解決方案 - 要做到這一點你必須:

\b([a-zA-Z]\.){2,}(?=\s|$)

編輯:我意識到,這實際上並不與字符串中其他標點符號工作,和其他邊緣情況。這是超級難看,但我認爲它應該是足夠好:

(?<=\s|^)((?:[a-zA-Z]\.){2,})(?=[[:punct:]]?(?:\s|$))

這是假設你已經有了這個[[:PUNCT:]字符類,並允許0-1標點符號後一個不會被捕獲的首字母縮略詞。我也修正了它,以便有一個捕獲組獲取整個首字母縮寫詞。檢查驗證http://rubular.com/r/lmr0qERLDh

獎勵:你現在得讓這個超級混淆給任何讀它的人。

+0

這很接近,但字可能會或可能不在字符串的末尾。最終,我以\ b(?:[a-zA-Z] \。){2,}結束了,它正在做我想做的事情。 – Randy

+0

我發佈的lookahead解決方案匹配空格或字符串的結尾。但是,如果你的工作正在爲你工作,請繼續。 – Ramfjord

+0

爲了記錄,我測試了這一點,它正在做同樣的事情,我正在做。它不符合首字母縮略詞的最後一個字母。這可能是語言依賴嗎? – Randy