在 Lua 中判断一个字符串是否为规范的 IPv4 地址,可以通过正则表达式(模式匹配)或自定义逻辑实现。以下是几种方法:
方法1:使用 string.match
进行模式匹配
function is_valid_ipv4(ip)
-- 匹配 0.0.0.0 ~ 255.255.255.255
local pattern = "^((25[0-5]|2[0-4]%d|1%d%d|[1-9]?%d)%.){3}(25[0-5]|2[0-4]%d|1%d%d|[1-9]?%d)$"
return ip and string.match(ip, pattern) ~= nil
end
-- 测试
print(is_valid_ipv4("192.168.1.1")) -- true
print(is_valid_ipv4("256.1.1.1")) -- false(超过255)
print(is_valid_ipv4("abc")) -- false
正则解释:
25[0-5]
:匹配 250~255。2[0-4]%d
:匹配 200~249。1%d%d
:匹配 100~199。[1-9]?%d
:匹配 0~99(允许前导零,如 “01”)。%.
:匹配点号(需转义)。
方法2:拆分字符串逐段验证
function is_valid_ipv4(ip)
if not ip then return false end
local segments = {}
for seg in string.gmatch(ip, "(%d+)") do
table.insert(segments, seg)
end
if #segments ~= 4 then return false end
for _, seg in ipairs(segments) do
local num = tonumber(seg)
if not num or num < 0 or num > 255 or tostring(num) ~= seg then
return false
end
end
return true
end
-- 测试
print(is_valid_ipv4("10.0.0.1")) -- true
print(is_valid_ipv4("10 .0 .0 .1")) -- false(含空格)
关键点:
- 检查是否为 4段数字。
- 每段数字必须在 0~255 范围内。
- 拒绝前导零(如 “012”)但允许 “0”。
注意事项
- 特殊地址:
"127.0.0.1"
、"0.0.0.0"
是合法的,但需根据业务决定是否允许。
- 性能:
- 方法1(正则)更简洁,适合快速验证。
- 方法2(拆分)可扩展性更强(如支持额外格式检查)。
- IPv6:
- IPv6需更复杂的正则或专用库(如
luasocket
)。
- IPv6需更复杂的正则或专用库(如
如果需要严格的网络编程验证,建议结合第三方库(如 luasocket.inet_pton
)。
内容由零声教学AI助手提供,问题来源于学员提问