📜  ips 的正则表达式 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:15:52.600000             🧑  作者: Mango

在Shell-Bash中使用正则表达式匹配ips

正则表达式在各种编程语言中都是一个非常强大且常用的工具,用来匹配各种字符串模式。在Shell-Bash中也可以使用正则表达式来匹配ips。

在Shell-Bash中使用正则表达式

Bash提供了 =~ 运算符可以用来匹配正则表达式,用法如下:

if [[ $string =~ $regex ]]; then
  echo "matched"
else
  echo "not matched"
fi

其中 $string 是需要匹配的字符串,$regex 是正则表达式。

匹配ipv4地址

ipv4地址有点复杂,我们需要用特殊的正则表达式来匹配它。一个ipv4地址的正则表达式可能如下:

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

解释:

  • ^ 匹配字符串的开始
  • (?:...) 非捕获组
  • (?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}) 匹配 0-255 的整数
  • . 匹配 .
  • {...} 匹配特定数量的前一项,此处为重复3次
  • $ 匹配字符串的结尾

示例代码:

ip_regex="^(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})\.){3}(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})$"
ip="192.168.1.1"

if [[ $ip =~ $ip_regex ]]; then
  echo "$ip is valid ipv4 address"
else
  echo "$ip is invalid ipv4 address"
fi
匹配ipv6地址

ipv6地址也比较复杂,需要用一个特殊的正则表达式来匹配它。一个ipv6地址的正则表达式可能如下:

^((?:(?:(?:[a-fA-F0-9]{1,4}:){6}|(?=(?:[a-fA-F0-9]{0,4}:){2,6}(?::|$))(?:(?:[a-fA-F0-9]{1,4}:){1,5}:|:)((?:[a-fA-F0-9]{1,4}:)*[a-fA-F0-9]{1,4}))(?<![^:]:)|::(?:((?::[a-fA-F0-9]{1,4}){1,5}):)?((?:(?:(?:[a-fA-F0-9]{1,4}:){1,5}(?::|$))(?<![^:]:)|:(?::[a-fA-F0-9]{1,4}){1,5}:|:(?::[a-fA-F0-9]{1,4}){1,4}:)(?!.*[^:]:))$

解释:

  • ^ 匹配字符串的开始
  • ((?:...)) 分组
  • (?:...|...) 非捕获组
  • [...] 匹配方括号内的任意字符
  • {n,m} 匹配前一项至少n次, 但不超过m次
  • ...* 匹配前一项0次或多次
  • ...+ 匹配前一项1次或多次
  • ...? 匹配前一项0次或1次
  • (?=...) 零宽度正预测先行断言
  • (?<=...) 零宽度正回顾后发断言
  • (?!...) 零宽度负预测先行断言
  • (?<!...) 零宽度负回顾后发断言
  • | 或者
  • \b 匹配单词边界
  • $ 匹配字符串的结尾

示例代码:

ip_regex="^((?:(?:(?:[a-fA-F0-9]{1,4}:){6}|(?=(?:[a-fA-F0-9]{0,4}:){2,6}(?::|$))(?:(?:[a-fA-F0-9]{1,4}:){1,5}:|:)((?:[a-fA-F0-9]{1,4}:)*[a-fA-F0-9]{1,4}))(?<![^:]:)|::(?:((?::[a-fA-F0-9]{1,4}){1,5}):)?((?:(?:(?:[a-fA-F0-9]{1,4}:){1,5}(?::|$))(?<![^:]:)|:(?::[a-fA-F0-9]{1,4}){1,5}:|:(?::[a-fA-F0-9]{1,4}){1,4}:)(?!.*[^:]:))$"
ip="2001:0DB8:AC10:FE01:0000:0000:0000:0000"

if [[ $ip =~ $ip_regex ]]; then
  echo "$ip is valid ipv6 address"
else
  echo "$ip is invalid ipv6 address"
fi
小结

在Shell-Bash中使用正则表达式匹配ips可以帮助我们验证输入的ip是否合法。以上的两个示例,分别演示了如何匹配ipv4地址和ipv6地址。明白了这些之后,你也可以根据自己的需要而修改正则表达式,以匹配更为特殊的ip地址。