tcl正则表达式与变量

时间:2018-02-08 23:02:09

标签: regex tcl cisco

我需要验证哪个IP地址宣布默认路由:

function extendMagnificIframe(){

    var $start = 0;
    var $iframe = {
        markup: '<div class="mfp-iframe-scaler">' +
                '<div class="mfp-close"></div>' +
                '<iframe class="mfp-iframe" frameborder="0" allowfullscreen></iframe>' +
                '</div>' +
                '<div class="mfp-bottom-bar">' +
                '<div class="mfp-title"></div>' +
                '</div>',
        patterns: {
            youtube: {
                index: 'youtu', 
                id: function(url) {   

                    var m = url.match( /^.*(?:youtu.be\/|v\/|e\/|u\/\w+\/|embed\/|v=)([^#\&\?]*).*/ );
                    if ( !m || !m[1] ) return null;

                        if(url.indexOf('t=') != - 1){

                            var $split = url.split('t=');
                            var hms = $split[1].replace('h',':').replace('m',':').replace('s','');
                            var a = hms.split(':');

                            if (a.length == 1){

                                $start = a[0]; 

                            } else if (a.length == 2){

                                $start = (+a[0]) * 60 + (+a[1]); 

                            } else if (a.length == 3){

                                $start = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); 

                            }
                        }                                   

                        var suffix = '?autoplay=1';

                        if( $start > 0 ){

                            suffix = '?start=' + $start + '&autoplay=1';
                        }

                    return m[1] + suffix;
                },
                src: '//www.youtube.com/embed/%id%'
            },
            vimeo: {
                index: 'vimeo.com/', 
                id: function(url) {        
                    var m = url.match(/(https?:\/\/)?(www.)?(player.)?vimeo.com\/([a-z]*\/)*([0-9]{6,11})[?]?.*/);
                    if ( !m || !m[5] ) return null;
                    return m[5];
                },
                src: '//player.vimeo.com/video/%id%?autoplay=1'
            }
        }
    };

    return $iframe;     

}

$('.my-selector').magnificPopup({
    type: 'iframe',
    iframe: extendMagnificIframe()
});

输出:

set command [ exec "show ip route" ]

我需要找到这个:“0.0.0.0/0 [200/0]来自10.17.1.252”,但是这个地址:10.17.1.252可以改变,我怎样才能把变量放在一个正则表达式中?

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

2 个答案:

答案 0 :(得分:3)

正则表达式不是最佳选择。

string first

搜索零差异模式时,format是最接近的匹配。使用string first "0.0.0.0/0 \[200/0] via $bgp_neighbor" $command 构建模式可以最大限度地减少您需要执行的转义。

在这种情况下,无论如何都不需要逃避:

string first

请注意,如果找到,{{1}}将返回字符串的位置,如果未找到,则返回-1。

文档: string

答案 1 :(得分:2)

你需要建立一个动态正则表达式,记住未转义的.匹配正则表达式中的任何字符,这就是为什么在将它添加到正则表达式之前需要escape the dynamic part

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

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 demo

此处,$bgp_neighbor保存IP地址。 $bgp_neighbor_escaped是相同的字符串,其中所有非单词字符都已转义(实际上您将.替换为\.)。 \y是字边界,以避免在152.1.0.23中匹配2222152.1.0.234444

请注意,您可以使用\s+替换所有文字空格,以匹配任何1个以上的空白字符。