2016-09-29 24 views
0

我有文字:"Johnny Alan Walker Sint Jansstraat 7, 1012 HG Amsterdam +123456789012"正則表達式 - 通過排除它的一部分找到字符串

是可以找到姓氏和電話? 排除地址? 地址正則表達式是這樣的:"([A-Z]{1,}[a-z]{1,}\s){2}[0-9]{0,4}\,\s{1,}[0-9]{4}\s[A-Z]{2}\s{1,}[a-zA-Z]{1,}"

(資本,housenumber,逗號,郵政編碼和城市兩個詞)我想結果字符串爲"Walker +123456789012"

+0

名稱和地址總是用2個空格分隔嗎? –

+0

@ʰᵈˑ可以有多於一個 – vladdihoney

+0

*可以* ***或*** *將*是嗎? –

回答

1

這應該做你所需要的,也不要假設三個名字(沒有中間名的作品),所以當你遇到沒有中間名的人時,它會更靈活一些:

.*?(\w+)\s*(?:[A-Z]{1,}[a-z]{1,}\s){2}[0-9]{0,4}\,\s{1,}[0-9]{4}\s[A-Z]{2}\s{1,}[a-zA-Z]{1,}\s*(\+\d+) 
  • .*?(\w+)\s* - 地址前的空格前捕獲的最後一個字。 .*?會懶惰地匹配任何地址,但不會捕獲。 \s*將匹配單詞和地址之間的空格。
  • (?:[A-Z]{1,}[a-z]{1,}\s){2}[0-9]{0,4}\,\s{1,}[0-9]{4}\s[A-Z]{2}\s{1,}[a-zA-Z]{1,} - 您的地址正則表達式,但使用非捕獲組(?:
  • \s*(\+\d+) - 捕捉+和下面的數字。 \s*將匹配地址和+之間的空格。

我重複使用了您的地址正則表達式,但使捕獲組無法捕獲。然後,我們使用(\w+)+和地址後面的數字((\+\d+))匹配地址(姓氏)前的最後一個單詞。

它在行動:https://regex101.com/r/YGiaJT/1

1

你可以做....

\w+\s+\w+\s+(\w+).*(\+\d+) 

你的捕捉組應該與你想匹配的相匹配...

本質上,這將「忽略」你的第一個和第二個「單詞」(第一個/中間名),然後disregar d從中間的一切,直到找到一個+然後捕獲它後面的數字。

活生生的例子:https://regex101.com/r/MjJCSv/1

從理論上講,如果你的姓氏和地址將始終超過1個空格隔開可以縮短這一點,並把它寫成

(\w+)\s{2,}.*(\+\d+) 

活生生的例子此功能:https://regex101.com/r/vGGB4z/1

實施例執行以後的在Java:http://ideone.com/RExAEO

+0

現在試圖讓它在java中工作 – vladdihoney

+0

我很迂腐,但是這並沒有從每個OP所需的電話號碼中捕獲'+'輸出。 –

+0

@ʰᵈˑ啊,謝謝你指出這一點,更新我的回答以反映這一點。 –

1

您可以使用以下內容來捕獲姓氏和電話號碼。

第一部分((\w+\s){3})將捕獲一個單詞後跟一個空格的發生。

第二部分(.+?)將捕捉一切

第三部分((\+?\d+)$)將捕獲的可選+(電話號碼前綴)和電話號碼的其餘部分,直到字符串的結尾。

(\w+\s){3}.+?(\+?\d+)$ 
  • \1 - 姓氏
  • \2 - 電話號碼

https://regex101.com/r/gqu0tt/4

,如果姓氏和地址與超過1個空格隔開,那麼你可以使用

(\w+)\s{2,}.+?(\+?\d+)$ 
  • \1 - 姓氏
  • \2 - 電話號碼

https://regex101.com/r/gqu0tt/5


我已經tested these expressions on the Java engine,而且他們還給了正確的比賽

相關問題