2017-07-26 178 views
2

我想從字符串中提取特定值。這是我的字符串從Lua中的特定字符串中提取IP地址

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 666 -j DNAT --to-destination 192.168.19.55 

我如何可以提取在Lua使用string.match此字符串192.168.19.55 IP地址?我做了local ip = s:match("--to-destination (%d+.%d+.%d+.%d+)"))但我沒有得到價值192.168.19.55。我獲得空值。

這裏有什麼錯誤嗎?有什麼建議麼 ?

+0

您需要使用'%-'來轉義'-',這是一個魔術字符在Lua模式中。 – lhf

回答

3

使用

local s = "iptables -t nat -A PREROUTING -p tcp -m tcp --dport 666 -j DNAT --to-destination 192.168.19.55" 
ip = s:match("%-%-to%-destination (%d+%.%d+%.%d+%.%d+)") 
print(ip) 
-- 192.168.19.55 

online Lua demo

請注意,-是Lua模式中的惰性量詞,因此必須轉義。此外,.匹配任何字符,因此您還需要將其轉義,以匹配字面點。

查看更多關於Lua patterns Web page

+0

很酷。非常感謝你 !! –

+1

請注意,如果您確定它始終是來自'destination'的IP,那麼您也可以使用['s:match(「% - % - to%-destination([%d。] +)」)']( https://ideone.com/pTzGrq)。 '''裏面的'[']'不必轉義,'[%d。] +'匹配一個或多個數字或點。 –

+0

是的。我完成了。歡呼! –

3

這也適用於:

ip = s:match("destination%s+(%S+)") 

它提取的下一個單詞destination後,一個詞是的非空白字符的運行。

+0

是的,它也適用於IPv6。但是,限制可用字符的數量可能會更好(例如,不應允許使用'() - 「), –