2016-02-05 16 views
0

我使用C來執行正則表達式。除了輸入字符串包含製表符之外的情況。如何安全地繞過RegEx中的標籤

這是我的正則表達式我插到regcomp功能:

(DROP).*(tcp).*([\\.0-9]+).*0\\.0\\.0\\.0.*dpt:([0-9]+)(.*) 

Regcomp返回OK沒有問題。

然後我用下面的字符串做匹配:

DROP\ttcp\t--\t202.153.39.52\t0.0.0.0/0\ttcp dpt:21 

我使用這樣的字符串來模擬的iptables的輸出,因爲我想打一個程序,看看哪些IP地址已列出。

當我執行我的程序,我收到以下輸出件從所述第一偏移執行正則表達式,其中,第一行是數據之後:

DROP tcp  --  202.153.39.52 0.0.0.0/0  tcp dpt:21 
DROP 
tcp 
2 
21 

一切都正確除了第二-最後一個值。它顯示2,但我預計它是202.153.39.52。我在RegEx中使用了([\\.0-9]+)來嘗試專門聲明我只希望數字和點匹配。

如何解決RegEx問題?

UPDATE

我接着就改用這個表達式,希望我得到的IP地址

(DROP).*(tcp).*([0-9]+)\\.([0-9]+)\\.([0-9]+)\\.([0-9]+).*(0\\.0\\.0\\.0).*dpt:([0-9]+) 

的每一個人八位這是我的結果:

DROP tcp  --  202.153.39.52 0.0.0.0/0  tcp dpt:21 
DROP 
tcp 
2 
153 
39 
52 
0.0.0.0 
21 

現在這意味着第一個([0-9]+)未正確處理。我應該收到202,而不是2.有什麼我做錯了嗎?我是否需要任何RegEx功能的特殊標誌?

+0

因此,如果您的輸入字符串不包含製表符,而是說,每個位置都有一個空格字符,那麼它的工作方式與您期望的相同? – CBroe

+0

我剛發現我需要更加確定。我必須用'。* \\'替換原始RegEx中的第二個'。*'以專門適應領先空間。經過實驗,結果發現我認爲標籤實際上是空間。 – Mike

+0

選項卡或空格無關緊要,'。*'與兩者匹配 - 以及其他所有內容。如果你切換到非貪婪的'。*?'(除了最後的'。*',在你的第一個正則表達式中),你應該得到你期望的結果。但我推薦[Gene's answer](http://stackoverflow.com/a/35216057/20938),它完全消除了不確定性。 –

回答

1

我認爲你對正則表達式語法和編碼爲字符串的語法之間的差異感到困惑(在沒有第一類正則表達式的Java等語言中)。

嘗試一些更強大的和常識:

DROP\s+tcp\s+\S+\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+0\.0\.0\.0/0\s+tcp\s+dpt:(\d+) 

這將捕獲的IP地址和唯一的端口號。爲什麼你想要捕獲一個固定的字符串,如DROP

作爲一個字符串,這就是:

"DROP\\s+tcp\\s+\\S+\\s+(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})\\s+0\\.0\\.0\\.0/0\\s+tcp\\s+dpt:(\\d+)" 

使用在線正則表達式測試儀like this one進行測試,並從正則表達式自動轉換爲字符串。

相關問題