我正在尝试创建一个正则表达式,它将执行以下操作:
Name description: "QUARTERLY PATCH FOR XAQE (JUL 2013 - 11.2.0.3.20) : (125546467)"
Val version : 11.2.0.3.4
为了输出:
"Name, 11.2.0.3.20"
"Val, 11.2.0.3.4"
我创建了以下正则表达式:/^([\w]+).*([\d\.\d]+).*/
,但它只匹配第二组中的最后一个数字,即在11.2.0.3.4
中它只匹配4
。有人可以帮忙吗?
此外,上面给出的两行可能超过两行,因此需要考虑版本号可以在行中任意位置的任意行。
答案 0 :(得分:1)
如果您只计划输出而不对捕获的组进行任何处理,那么这样做:
$str =~ s/([\n\r]|^)(Name|Val).*?(\d+(\.\d+)+).*/$1"$2, $3"/g;
答案 1 :(得分:1)
你也可以使用单行代码:
perl -lne '/(\w+).*?(\d+(\.\d+)+)/; print "$1, $2"' <filename>
__END__
Name, 11.2.0.3.20
Val, 11.2.0.3.4
答案 2 :(得分:0)
你的问题是.*
是贪婪的,并且在模式仍然匹配时会消耗尽可能多的费用。一种解决方案是使其变得懒惰.*?
同样[\d\.\d]+
表示匹配\d
,\.
和\d
之一,因此它与[\d.]+
相同,而不是\d+(\.\d+)+
。你想要什么,因为它会匹配&#34; 2013&#34;在第一行。 ^([\w]+).*?(\d+(\.\d+)+).*
更合适。
完成这两项更改后:
{{1}}