我需要编写一个程序,在字符串中搜索版本号。
版本的长度可能不同,就像这样
[number].[number].[....].[number]
例如1.23.1
。
答案 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;