使用regex101构建的IP正则表达式在Bash中无法匹配求助
解决Bash脚本中IP地址正则匹配失败的问题
我来帮你搞定这个问题!你在正则测试工具里用的是PCRE(Perl兼容正则表达式),但Bash默认使用的是POSIX扩展正则表达式,两者语法有几个关键差异,直接导致你的正则没法正常工作:
问题根源
- 非捕获组
(?:...)不被支持:Bash的扩展正则不识别这种语法,你可以直接去掉非捕获组的标识,改用普通分组或者直接简化表达式即可 \d不是有效的数字匹配符:在Bash正则体系里,要匹配数字得用[0-9]或者标准POSIX字符类[[:digit:]]
修正后的脚本
把正则表达式调整成符合Bash规范的写法,修改后的完整脚本如下:
temp="eu-west 140.243.64.99 " regexp="([0-9]{1,3}\.){3}[0-9]{1,3}" if [[ $temp =~ $regexp ]]; then echo "found a match: ${BASH_REMATCH[0]}" else echo "No IP address returned" fi
改动说明
- 把
(?:\d{1,3}\.)+改成了([0-9]{1,3}\.){3}:因为IP地址固定是3组数字.加最后一组数字,用{3}替代+更精准,同时替换\d为[0-9],去掉了不被支持的非捕获组标识 - 新增
${BASH_REMATCH[0]}来输出匹配到的具体内容,方便直观验证结果
运行这个脚本后,你会得到预期输出:found a match: 140.243.64.99,完美匹配到目标IP地址!
内容的提问来源于stack exchange,提问作者rjm61
相关产品推荐
相关产品推荐

