【问题标题】:How do I find a version number in a string using perl [closed]如何使用 perl 在字符串中查找版本号 [关闭]
【发布时间】:2016-07-08 09:41:13
【问题描述】:

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

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

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

例如1.23.1

我在How to extract IP addresses from a text file using Perl?发现了类似的东西

【问题讨论】:

  • 请提供一些示例输入/输出字符串。你试过什么?
  • 您的数据有任何特定格式吗?它是文件的一部分吗?
  • 我们在这里帮助您解决您在代码中遇到的问题。因此,如果您不显示您的代码,那么我们真的无能为力。 Stack Overflow 不是让别人为您完成工作的地方。这不像分享辣椒食谱——公司为你免费要求的那种解决方案支付了数千美元,这是非常不合适的。自己做一些努力,如果你完全卡住了,把你的代码放在这里并解释哪里出了问题。这样您就可以更多地关注这个问题,并且应该得到帮助来自己解决它。

标签: string perl search version


【解决方案1】:

你应该学习一些简单的正则表达式,因为这不是什么难的问题。您正在搜索的正则表达式可能是这样的:

(\d+\.)+\d+

这会找到像 1.23.235.22.263 这样的字符串

【讨论】:

  • 要捕获版本号,您可能需要在整个模式周围添加括号:if ($vstring =~ /((?:\d+\.)+\d+)/) { print "version found: '$1'\n"; }
【解决方案2】:

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

[编号].[编号].[....].[编号](例如 1.23.1)。

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

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

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

但我们可以改进这一点。 “一个东西”后跟“零个或多个相同的东西”与说“一个以上的东西”是一样的。所以我们可以将正则表达式简化为(\d+\.)+\d+

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

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

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

【讨论】:

  • 我觉得你的结论应该是\d+(?:\.\d+)*,否则version 1会被忽略。你几乎已经满足了规定的要求(解决方案应该是\d+(?:\.\d+){2,}),但我一点也不相信!
  • 我们需要涵盖的确切格式当然还有待商榷。我假设版本号至少需要包含一个点。我承认这比我们给出的例子要宽松一些。
  • 我认为将点作为初始数字序列的一部分包含在内更尴尬。 \d+(?:\.\d+)* 适用于 \d+(?:\.\d+)+\d+(?:\.\d+){2,} 等而没有显着变化,而 (?:\d+\.)+\d+ 不完整且不正确,因为 (?:\d+\.)+\d*
  • 这是一个完全合理的建议。我当然会投票赞成包含它的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2018-10-02
  • 2013-04-21
  • 2014-07-10
  • 1970-01-01
  • 2021-12-11
相关资源
最近更新 更多