如何使用perl在字符串中查找版本号

时间:2016-07-08 09:41:14

标签: string perl search version

我需要编写一个程序,在字符串中搜索版本号。

版本的长度可能不同,就像这样

[number].[number].[....].[number]

例如1.23.1

我在How to extract IP addresses from a text file using Perl?

中发现了类似内容

2 个答案:

答案 0 :(得分:2)

你应该研究一些简单的正则表达式,因为这不是一个难题。您正在搜索的正则表达式可能是:

(\d+\.)+\d+

这将找到类似1.23.235.22.263

的字符串

答案 1 :(得分:1)

你应该为自己解决问题付出一些努力。但是,嘿,这是星期五,我感觉很慷慨。

  

[number]。[number]。[....]。[number](例如1.23.1)。

这足以让我们前进。在这里用“数字”,我假设你的意思是“正整数”。正整数是一个或多个数字。在正则表达式中,数字与\d匹配,我们可以将“一个或多个”内容与+匹配。所以“一个或多个数字”是d+

那么我们的最小版本号是多少。假设它包含两个用点分隔的正整数。我们需要在这里小心,因为点在正则表达式中具有特殊含义(它匹配任何字符)。我们可以通过\转义它,将其变成一个点。因此,我们的最小版本号与\d+\.\d+匹配。

现在变得有点困难了。我们希望在字符串中间允许任意数量的\d+\.元素。天真的版本可能是\d+\.(\d+\.)*\d+*表示“零或更多”,因此整个表达式表示“一个或多个数字后跟一个点,后跟一个或多个数字后跟一个点的零或更多次重复,后跟一个或多个数字”

但我们可以改进。 “其中一件事”之后是“零或多件同样的事情”,就像说“其中一件事”一样。因此,我们可以将正则表达式简化为(\d+\.)+\d+

此外,由于我们将要捕获匹配项,因此我会将(...)转换为(?:...),但仍会对正则表达式部分进行分组,但不会捕获匹配项。

所以我们最终得到(?:\d+\.)+\d+。给定$string中的字符串,我们可以使用以下内容填充包含$string中所有版本号的数组:

my @versions = $string =~ /((?:\d+\.)+\d+)/g;