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

Regex to find file version C#

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

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 ]

我在这里错过了什么? 请建议一些好的正则表达式。 提前致谢!

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

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

Demo

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

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

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

  • 此外,我通过将 ?: 放在 ( 之前,将您的正则表达式中的一些组作为非捕获组,因为您不需要单独捕获它们。

你总是假设版本号后面会有.。但是,如果版本后面没有指定类型,那么多余的.就不存在了。因此,您可以使用以下内容:

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

Demo

  • ^匹配行首

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

    定义
    • [\d+\.]+ 匹配 . 后面的 1+ 个数字 1+ 次
    • \d 匹配最后一位
  • \.*匹配版本号后是否有指定类型

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

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