首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有变量的tcl正则表达式

带有变量的tcl正则表达式
EN

Stack Overflow用户
提问于 2018-02-08 23:02:08
回答 2查看 1.4K关注 0票数 1

我需要验证宣布默认路由的ip地址是什么:

代码语言:javascript
复制
set command [ exec "show ip route" ]

输出:

代码语言:javascript
复制
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       + - replicated route, % - next hop override

Gateway of last resort is 10.17.1.252 to network 0.0.0.0

B*    0.0.0.0/0 [200/0] via 10.17.1.252, 01:16:22
      10.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C        10.17.1.0/24 is directly connected, FastEthernet1/0
L        10.17.1.253/32 is directly connected, FastEthernet1/0
      172.22.0.0/32 is subnetted, 1 subnets
C        172.22.12.250 is directly connected, Loopback1
      172.26.0.0/16 is variably subnetted, 3 subnets, 2 masks
B        172.26.69.64/30 [200/0] via 10.17.1.252, 01:16:33
C        172.26.70.64/30 is directly connected, FastEthernet0/0
L        172.26.70.66/32 is directly connected, FastEthernet0/0

我需要找到这个:“0.0.0.0/0200/0通过10.17.1.252",但是这个地址: 10.17.1.252可以改变,我如何在正则表达式中放置一个变量?

代码语言:javascript
复制
set routes [ regexp {(0.0.0.0\/0 \[200\/0\] via $bgp_neighbor)} $command match default_route ]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-09 01:23:30

正则表达式不是这方面的最佳选择。

代码语言:javascript
复制
string first [format {0.0.0.0/0 [200/0] via %s} $bgp_neighbor] $command 

在搜索零方差模式时,string first是最接近的匹配。使用format构建模式可以最大限度地减少所需的转义量。

在这种情况下,无论如何也不需要太多的逃避:

代码语言:javascript
复制
string first "0.0.0.0/0 \[200/0] via $bgp_neighbor" $command

注意,如果找到,string first返回字符串的位置,如果没有找到,则返回-1。

文档:字符串

票数 3
EN

Stack Overflow用户

发布于 2018-02-08 23:31:43

您需要构建一个动态正则表达式,请记住,未转义的.与regex中的任何字符匹配,这就是为什么在将其添加到regex之前需要动态部分

下面是解决这个问题的一种方法($a是保存文本的变量):

代码语言:javascript
复制
proc reEscape {str} {
    regsub -all {\W} $str {\\&}
}
set bgp_neighbor {10.17.1.252}
set bgp_neighbor_escaped [reEscape $bgp_neighbor]
set reg {\y0\.0\.0\.0/0 \[200/0] via }
append reg $bgp_neighbor_escaped
append reg {\y}

if {[regexp $reg $a]} {
  puts yes
} else {
  puts no
}

Tcl演示

在这里,$bgp_neighbor保存IP地址。$bgp_neighbor_escaped是同一个字符串,所有的非单词字符都是转义的(实际上将用\.替换. )。\y是单词边界,以避免在2222152.1.0.234444中匹配152.1.0.23

注意,可以用\s+替换所有文字空格,以匹配任何1+空格字符。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48696209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档