正则表达式查找文件版本 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]+))?$
这是对您的 ^(?<version>(\d+\.\d+)+)\.(?<type>\w*)$
正则表达式问题的解释,
您的正则表达式中的 (\d+\.\d+)+
将无法正确捕获版本,因为这将期望类型为一个或多个数字的数据,后跟文字点,再后跟一个或多个数字并将其完整一次或多次。这部分的更正版本将是 \d+(?:\.\d+)+
,它可以捕获 1.1
或 1.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*)$
^
匹配行首
版本捕获组由(?<version>[\d+\.]+\d)
定义
[\d+\.]+
匹配 .
后面的 1+ 个数字 1+ 次
\d
匹配最后一位
\.*
匹配版本号后是否有指定类型
类型捕获组由(?<type>\w*)
定义
\w*
匹配任意数量的单词字符
$
匹配行尾
下面是一些不带扩展名的文件名示例,我想从中提取文件的版本和类型。
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]+))?$
这是对您的 ^(?<version>(\d+\.\d+)+)\.(?<type>\w*)$
正则表达式问题的解释,
您的正则表达式中的
(\d+\.\d+)+
将无法正确捕获版本,因为这将期望类型为一个或多个数字的数据,后跟文字点,再后跟一个或多个数字并将其完整一次或多次。这部分的更正版本将是\d+(?:\.\d+)+
,它可以捕获1.1
或1.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*)$
^
匹配行首版本捕获组由
定义(?<version>[\d+\.]+\d)
[\d+\.]+
匹配.
后面的 1+ 个数字 1+ 次\d
匹配最后一位
\.*
匹配版本号后是否有指定类型类型捕获组由
定义(?<type>\w*)
\w*
匹配任意数量的单词字符
$
匹配行尾