我使用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功能的特殊標誌?
因此,如果您的輸入字符串不包含製表符,而是說,每個位置都有一個空格字符,那麼它的工作方式與您期望的相同? – CBroe
我剛發現我需要更加確定。我必須用'。* \\'替換原始RegEx中的第二個'。*'以專門適應領先空間。經過實驗,結果發現我認爲標籤實際上是空間。 – Mike
選項卡或空格無關緊要,'。*'與兩者匹配 - 以及其他所有內容。如果你切換到非貪婪的'。*?'(除了最後的'。*',在你的第一個正則表達式中),你應該得到你期望的結果。但我推薦[Gene's answer](http://stackoverflow.com/a/35216057/20938),它完全消除了不確定性。 –