1

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    
%

在 Step Number - 3 中,我得到的输出为0.10.10.1. 为什么我在1这里失踪?这是一个应该匹配的数字\d,但为什么要匹配(.*)

4

2 回答 2

4

首先.*是吃的1

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

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

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

这就是进入捕获组的内容,您命名为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
于 2013-09-13T13:04:48.823 回答
0

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

于 2013-10-03T08:15:37.150 回答