匹配IP地址的正则表达式学习(BGP高级路由控制)

猫萌 发布于 2025-06-04 最后更新于 2025-06-04 172 次阅读


在学习BGP的高级特性应用中,需要用到AS_Path Filter(AS路径过滤器),Community Filter(团体属性过滤器)等工具进行路由匹配,需要用到正则表达式,因此学习正则表达式的对应字符应用。

常用正则表达式列表

限定符类型应用
a?a出现0次或1次
a*a出现0次或多次
a+a出现1次或多次
a{6}a出现6次
a{2,6}a出现2-6次
a{2,}a出现2次及以上
或运算符类型应用
(a|b)匹配a或b
(ab)|(cd)匹配ab或cd
字符类应用
[abc]匹配a或b或c
[a-c]匹配a或b或c
[a-zA-Z0-9]匹配所有小写和大写英文字符及数字字符
[^0-9]匹配非数字字符
元字符意义
\d匹配数字字符
\D匹配非数字字符
\w匹配单词字符(包括英文、数字、下划线)
\W匹配非单词字符
\s匹配空白符(包括空格、换行符、Tab)
\S匹配非空白字符
.匹配任意字符(不包括换行符)
\b \bword标志字符边界
^匹配行首
$匹配行尾
_下划线,匹配任意的一个分隔符
匹配逗号”,“、左花括号”{“、右花括号”}“
匹配左圆括号"("、右圆括号")"
匹配输入字符串的开始位置(同^)
匹配输入字符串的结束位置(同$)
匹配一个空格
_10 匹配(10、{10、空格10等
10_ 匹配10)、10}、10空格等

正则表达式具有以下功能:
检查字符串中符合某个规则的子字符串,并可以获取该子字符串。
根据匹配规则对字符串进行替换操作。


使用正则表达式对IP地址与子网掩码匹配

可在网站https://regex101.com/在线进行正则表达式匹配,列出以下数字

192.168.1.1
192.168.1.256    #(非正确IP)
256.244.1.1    #(非正确IP)
1.1.1.1
166.166.166    #(非正确IP)
0.0.0.0
66.66.66.66
38.38.38.38
138.138.138.138
138.1.1.1

首先IP地址的格式为xxx.xxx.xxx.xxx,先以前三个数字入手,匹配“xxx.”

匹配 250~255

首先匹配为250,251,252,253,254,255,因此需要输入正则表达式25[0-5]

匹配 200~249

其次匹配为20x,21x,22x,23x,24x,x可以为0-9任意数字,因此需要输入正则表达式2[0-4]\d,\d为匹配任意数字,与[0-9]相当。

匹配 0~199

IP首位可匹配为0或1或2,最后匹配IP地址首位不为2,首位为0xx和1xx,此时x可以为0-9任意数字,因此需要输入正则表达式[01]\d\d匹配首位为0或1数字,\d为匹配任意数字,与[0-9]相当。

但IP地址前三个数字可有x,xx,xxx三种情况,如1.x.x.x,11.x.x.x,111.x.x.x。不完全为三位数字,因此需要在上一步骤中的[01]\d\d基础上,加上?进行匹配0次或1次,加上两个?匹配一位数字和两位数字的情况。因此需要改写正则表达式[01]?\d\d?,即为匹配不完全为三位数字的IP地址情况。

将以上三个正则表达式综合起来合并,使用(x|x)或运算符进行隔开,因此正则表达式写为

(25[0-5]|2[0-4]\d|[01]?\d\d?)

还需要匹配"xxx."中的".",使用转义字符\匹配".",因此正则表达式写为

((25[0-5]|2[0-4]\d|[01]?\d\d?)\.)

IP地址中前三个匹配相同,因此直接在正则表达式上加上限定符{}进行次数匹配,因此正则表达式写为

((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}

此时匹配为"0~255.0~255.0~255.",但不能将限定符{}次数匹配改为"4"。{3}只能匹配三次,如果次数改为"4",则匹配的为"0~255.0~255.0~255.0~255.",末尾多了字符".",是错误的表达。

因此将前段的正则表达式去掉匹配".",复制粘贴,得到正确正则表达式为

((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)

最后加上标志字符边界,得到最终的正则表达式为

\b((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)\b

在正则表达式上加上子网掩码匹配

如上同理思路应用,若添加上带子网掩码的IP正则表达式,可以写为

#斜杠分隔格式xxx.xxx.xxx.xxx/xx
\b((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)
\/    #转义"/"
([0-9]|[1-2][0-9]|3[0-2])\b    #子网掩码0-32
#完整为
\b((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)\/([0-9]|[1-2][0-9]|3[0-2])\b

#空格分隔格式xxx.xxx.xxx.xxx xx
\b((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)
\s+    #匹配一个或多个空格,可改为精确一个空格"\s"
([0-9]|[1-2][0-9]|3[0-2])\b    #子网掩码0-32
#完整为
\b((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)\s+([0-9]|[1-2][0-9]|3[0-2])\b

网站上测试如图


在AS_Path中使用正则表达式匹配示例

^$匹配不包含任何AS号的AS_Path,也就是本AS内的路由
.*匹配所有,任何路由
^10[0138]$匹配100、101、103、108
^10[^3-8]$匹配除103~108以外的AS_Path
^10.匹配100~109,以及10
^12(_34)?_56$匹配12 56,及12 34 56

如使用AS_Path Filter匹配拒绝AS138的路由,允许其他AS路由通过传递

[R1] ip as-path-filter name1 deny _138$
[R1] ip as-path-filter name1 permit .*
#直接调用方式
[R1] bgp 666
[R1-bgp] peer 138.138.138.138 as-number 520
[R1-bgp] ipv4-family unicast
[R1-bgp-af-ipv4] peer 138.138.138.138 as-path-filter name1 export
#路由策略方式
[R1] route-policy AS_Path permit node 10
[R1-route-policy] if-match as-path-filter name1
[R1-route-policy] quit
[R1] bgp 666
[R1-bgp] peer 138.138.138.138 as-number 520
[R1-bgp] ipv4-family unicast
[R1-bgp-af-ipv4] peer 138.138.138.138 route-policy AS_Path export

高级Community Filter可以使用正则表达式进行匹配。

基本Community Filter编号范围:1~99。高级Community Filter编号范围:100~199。

如使用高级Community Filter匹配携带以38开头的Community值的路由

[R1} ip community-filter 100 permit ^38

在学习BGP的高级特性中,涉及正则表达式的使用,特此学习理解并使用正则表达式进行路由匹配,作为学习日志记录。