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
匹配的数字,但为什么它与(.*)
一起加工。
答案 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