TCL:需要有关TCL正则表达的信息

时间:2013-09-13 13:02:18

标签: regex tcl

1)我的字符串在

之下
% set a {
    absdsdgfg
    dsdgsdg
    sdgsdgsd
    asdas192.168.2.1
    asdfsdf
    sdfsdf
    10.10.10.1
}
absdsdgfg
dsdgsdg
sdgsdgsd
asdas192.168.2.1
asdfsdf
sdfsdf
10.10.10.1

2)正则表达式

% regexp {.*(\d+\.\d+\.\d+\.\d+).*} $a -> ip
1

3)输出

% set ip
0.10.10.1    
%

在步骤编号-3中,我得到的输出为0.10.10.1。为什么我在这里遗失1?它是一个应与\d匹配的数字,但为什么它与(.*)一起加工。

2 个答案:

答案 0 :(得分:4)

第一个.*正在吃1

为避免这种情况发生,您可以使用.*的惰性版本:.*?

背后的原因是第一个.*首先匹配所有内容直到字符串结尾,然后一次返回一个字符,检查正则表达式尚未匹配的其他字符。 / p>

一旦它返回到0之前的点:0.10.10.1,正则表达式的最后一部分匹配(意味着它不会返回更多)并且正则表达式返回一个成功匹配。< / p>

这就是捕获组中的内容,您将其命名为ip

然而.*?会尽可能少地匹配并获得192.168.2.1。如果您想获得10.10.10.1,请使用此正则表达式:

regexp {.*?(\d+\.\d+\.\d+\.\d+)\s*$} $a -> ip

或者你可以缩短它:

regexp {.*?(\d+(?:\.\d+){3})\s*$} $a -> ip

实际上,这里甚至不需要.*?

regexp {(\d+(?:\.\d+){3})\s*$} $a -> ip

答案 1 :(得分:0)

对于一个字符串  设置{     absdsdgfg     dsdgsdg     sdgsdgsd     asdas192.168.2.1     asdfsdf     sdfsdf     10.10.10.1  } 使用正则表达式:           %regexp -all {(\ d +。\ d +。\ d +。\ d +)} $ a ip           %放“$ ip”             10.10.10.1