2015-12-09 146 views
2

這是我的字符串:如何捕捉多個可選組

2015-12-07T14:05:14 + 02:00 1.1.1.1 < 13> 1 2015-12-07T14:05:13+ 02:00 我的_服務器 - - - - 2.2.2.2

我試圖捕捉 「1.1.1.1」, 「我的_服務器」 和 「2.2.2.2」。不過,我需要「1.1.1.1」和「my_server」部分應該是可選的。我寫了一些正則表達式,當我的測試字符串與上面一樣時,它確實匹配了所有東西。但它不匹配時,我的測試字符串是這樣的:

2.2.2.2

因此,這裏是我的正則表達式:

(?:(?P<server_ip>[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}).*?(?:(?P<server_name>\S*?) 
- - - -)).*?(?P<remote_ip>[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}) 

我測試正則表達式here。有人可以幫我嗎?

+2

爲什麼不通過在他們後面添加一個'?'使捕獲組成爲可選的可選組件? – timgeb

+1

如果它們是可選的,輸入字符串是什麼樣的? –

+0

@timgeb愚蠢的我!我確實使你的工作方式像[this](http://bit.ly/1YYs8B8)。如果你回答,我可以解決這個問題。 – gunererd

回答

2

只需在右括號之後添加?,即可使任何捕獲組成爲可選(更精確:匹配零次或一次)。例如。

(someregex)? 

對於本應該捕獲「1.1.1.1」和「my_server」的組執行此操作。