You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash环境下验证CIDR地址有效性的正则表达式问题

解决Bash中CIDR地址验证的正则问题

你遇到的核心问题是Bash默认使用POSIX标准的正则表达式,而非Perl/PHP/JS常用的PCRE(Perl兼容正则)语法,所以\d这类PCRE专属标记无法直接生效,必须换成POSIX规范的写法,同时还要调整正则的锚定和转义规则。

调整后的Bash兼容正则

把原正则里所有的\d替换为POSIX标准的[[:digit:]],同时用^和$锚定整个字符串(替代原正则末尾的(?![.\d]),避免部分匹配),最终的正则如下:

^(((25[012345]|2[0-4][[:digit:]]|1?[[:digit:]][[:digit:]]?)\.){3}(25[012345]|2[0-4][[:digit:]]|1?[[:digit:]][[:digit:]]?))\/([1-9]|[1-2][[:digit:]]|3[0-2])$

可直接运行的测试脚本

基于上面的正则,我修改了你的测试脚本,确保在Bash中能正常工作:

#!/bin/bash

if [ "$1" = "" ]; then
    echo "Usage: $(basename $0) 192.168.1.0/24"
    exit 1
fi

# 定义Bash兼容的CIDR验证正则
CIDR_REGEX='^(((25[012345]|2[0-4][[:digit:]]|1?[[:digit:]][[:digit:]]?)\.){3}(25[012345]|2[0-4][[:digit:]]|1?[[:digit:]][[:digit:]]?))\/([1-9]|[1-2][[:digit:]]|3[0-2])$'

if [[ $1 =~ $CIDR_REGEX ]]; then
    echo "✅ Valid CIDR address: $1"
else
    echo "❌ Invalid CIDR address: $1"
fi

额外方案:用Perl兼容模式快速复用原正则

如果你的系统支持grep -P(大部分Linux发行版都支持,BSD系统可能没有),可以直接复用你原来的PCRE正则,不用修改:

#!/bin/bash

if [ "$1" = "" ]; then
    echo "Usage: $(basename $0) 192.168.1.0/24"
    exit 1
fi

# 直接使用原PCRE正则,通过grep -P启用Perl兼容模式
echo "$1" | grep -qP '(((?:25[012345]|2[0-4]\d|1?\d\d?)\.){3}(?:25[012345]|2[0-4]\d|1?\d\d?))(?:\/([1-9]|[1-2][0-9]|3[0-2]))(?![.\d])'

if [ $? -eq 0 ]; then
    echo "✅ Valid CIDR address: $1"
else
    echo "❌ Invalid CIDR address: $1"
fi

内容的提问来源于stack exchange,提问作者Mogens TrasherDK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:28:44