正则(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})能否匹配IPv4地址?
关于IPv4正则匹配的问题解答
现有正则的匹配能力
你提供的(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})规则,本身支持匹配每段为1-3位数字的点分四段格式,所以可以匹配xxx.xxx.xxx.xxx、xx.xxx.x.x这类格式的IPv4字符串。
ping返回结果匹配失败的原因
90%以上的概率是你调用正则时用了全串匹配逻辑:
- 这个正则仅匹配IP段本身,而ping返回的完整字符串包含其他字符,如果你用的是Java的
matches()、Python的re.fullmatch()这类要求整个字符串完全符合正则规则的方法,必然会返回匹配失败。 - 少数情况是你错误处理了捕获组取值,当前正则带1个捕获组,部分场景下需要主动取第1个分组的内容才能拿到IP。
适配你场景的修复方案
改用正则的子串搜索方法即可,以Python为例:
import re ping_output = "PING google.com (172.217.1.14): 56 data bytes" ip_match = re.search(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", ping_output) if ip_match: server_ip = ip_match.group() # 拿到的server_ip就是172.217.1.14
其他语言对应调用子串搜索接口即可:Java用Pattern类的matcher().find()方法,Go用regexp.FindString()方法。
额外补充
当前正则不是严格的IPv4校验规则,会匹配到999.999.999.999这类不存在的IP,但你是从ping命令返回结果中提取IP,ping返回的IP本身都是合法有效的,所以无需额外加严格的范围校验逻辑,足够使用。
内容的提问来源于stack exchange,提问作者user16227278
相关产品推荐
相关产品推荐

