正则表达式查找文件版本C#

时间:2019-02-28 05:36:04

标签: regex file version regex-group

下面是一些没有扩展名的文件名示例,我想从中提取文件的版本和类型。

1] 2.13.1801.221 预期输出-[Version: 2.13.1801.221 and Type: Null]

2] 2.17.1801.221.SQLServer      预期的产量-[Version: 2.17.1801.221 and Type: SQLServer]

3] 2.19.1801.SQLite    预期的产量-[Version: 2.19.1801 and Type: SQLite]

我正在使用下面的正则表达式从文件名中提取版本和类型

^(?<version>(\d+\.\d+)+)\.(?<type>\w*)$

但这不起作用。

使用正则表达式在线测试,结果显示为:[https://i.stack.imgur.com/c9FlW.png]

匹配组的形成为:[https://i.stack.imgur.com/V0azi.png ]

我在这里想念什么? 请提出一些好的正则表达式。 预先感谢!

2 个答案:

答案 0 :(得分:1)

您的正则表达式有点不正确,这就是为什么它不起作用的原因。您应该使用正确的正则表达式,

^(?<version>\d+(?:\.\d+)+)(?:\.(?<type>[a-zA-Z]+))?$

Demo

这是您的^(?<version>(\d+\.\d+)+)\.(?<type>\w*)$正则表达式中问题的说明,

  • 您的正则表达式中的此(\d+\.\d+)+将无法正确捕获版本,因为这将期望输入一个或多个数字类型的数据,然后再次输入文字点,然后再输入一个或多个数字,并将其完整存储一次或多次。此部分的更正版本将是此\d+(?:\.\d+)+,它可以捕获诸如1.11.2.33.11等的字符串。

  • 您的正则表达式部分的第二个问题是此\.(?<type>\w*),它将与文字点匹配,然后与零个或多个单词字符匹配,甚至在由于以下原因而实际上没有版本数据的情况下,也将匹配最后一位数字的字符它将与字符串221中的2.13.1801.221匹配,这不是您想要的。实际上,由于字符串中可能没有您的版本,因此您需要使用?运算符将整个组指定为可选,并使用[a-zA-Z]来捕获版本数据,并且更正后的正则表达式部分应为{ {1}}。如果您的版本数据可以包含数字,则可以通过将(?:\.(?<type>[a-zA-Z]+))?更改为[a-zA-Z]+来提高秒数,这意味着您的版本字符串应以字母开头,并且以后可以出现数字。

  • 此外,我将[a-zA-Z][a-zA-Z\d]*放在?:的前面,从而使您的正则表达式中的某些组成为了非捕获组,因为您不需要分别捕获它们。

答案 1 :(得分:0)

您始终假定版本号之后将有.。但是,如果在版本之后未指定类型,则多余的.将不存在。因此,您可以使用以下代码:

^(?<version>[\d+\.]+\d)\.*(?<type>\w*)$

Demo

  • ^匹配行的开头

  • 版本捕获组由(?<version>[\d+\.]+\d)

    定义
    • [\d+\.]+匹配1+个数字,后跟. 1次以上
    • \d匹配最后一位
  • \.*匹配在版本号之后是否指定了任何类型

  • 类型捕获组由(?<type>\w*)

    定义
    • \w*匹配任意数量的单词字符
  • $与行尾匹配