正则表达式匹配带小数的字符串

时间:2014-03-13 14:29:03

标签: regex string perl

我正在尝试创建一个正则表达式,它将执行以下操作:

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。有人可以帮忙吗?

此外,上面给出的两行可能超过两行,因此需要考虑版本号可以在行中任意位置的任意行。

3 个答案:

答案 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}}

RegExr