Regex 正则表达式查找文件版本C#
下面是一些不带扩展名的文件名示例,我想从中提取文件的版本和类型 1] 2.13.1801.221预期输出-Regex 正则表达式查找文件版本C#,regex,file,version,regex-group,Regex,File,Version,Regex Group,下面是一些不带扩展名的文件名示例,我想从中提取文件的版本和类型 1] 2.13.1801.221预期输出-[版本:2.13.1801.221,类型:Null] 2] 2.17.1801.221.SQLServer 预期输出-[版本:2.17.1801.221,类型:SQLServer] 3] 2.19.1801.SQLite 预期输出-[版本:2.19.1801,类型:SQLite] 我使用下面的正则表达式从文件名中提取版本和类型 ^(?(\d+\.\d++)\(?\w*)$ 但这不起作用 使用
[版本:2.13.1801.221,类型:Null]
2] 2.17.1801.221.SQLServer
预期输出-[版本:2.17.1801.221,类型:SQLServer]
3] 2.19.1801.SQLite
预期输出-[版本:2.19.1801,类型:SQLite]
我使用下面的正则表达式从文件名中提取版本和类型
^(?(\d+\.\d++)\(?\w*)$
但这不起作用
使用regex online进行测试,结果如下:[
匹配组组成如下:[
]
我错过了什么?
请推荐一些好的正则表达式。
提前感谢!您的正则表达式有点不正确,这就是它不起作用的原因。您应该使用的正确正则表达式如下:
^(?<version>\d+(?:\.\d+)+)(?:\.(?<type>[a-zA-Z]+))?$
^(?\d+(?:\。\d+)(:\(?[a-zA-Z]+)$
下面是您的^(?(\d+\.\d++)\(?\w*)$
regex中问题的解释
- 正则表达式中的此
将无法正确捕获版本,因为这将要求数据类型为一个或多个数字,后跟文字点,再后跟一个或多个数字,并对其进行一次或多次整定。此部分的正确版本将是此(\d+\.\d+)
可以捕获字符串,如\d+(?:\.\d+)+
或1.1
等1.2.33.11
- 正则表达式部分的第二个问题是
其中,这将匹配一个文字点,然后零个或多个单词字符,这些字符甚至将匹配最后一个数字部分,以防实际上没有版本数据,因此它将匹配字符串\(?\w*)
中的2.13.1801.221
,这不是您想要的。事实上,由于字符串中可能没有您的版本,您需要使用221
运算符将整个组指定为可选组,并使用?
捕获版本数据,并且更正的正则表达式部分应为[a-zA-Z]
。如果版本数据可以包含数字,则可以通过将(?:\(?[a-zA-Z]+)?
更改为[a-zA-Z]+
这意味着您的版本字符串应该以字母开头,数字可以稍后出现[a-zA-Z][a-zA-Z\d]来增强第二个组*
- 另外,我在正则表达式中将一些组作为非捕获组,方法是将
放在?:
之前,因为您不需要单独捕获它们(
。但是,如果版本后面没有指定类型,则额外的
将不存在。因此,您可以使用以下选项:
^(?<version>[\d+\.]+\d)\.*(?<type>\w*)$
^(?[\d+\.]+\d)\.*(\w*)$
匹配行的开头^
- 版本捕获组由
(?[\d+\.]+\d)
匹配1+个数字,后跟[\d+\.]+
,匹配次数为1+次
与最后一位数字匹配\d
匹配版本号之后是否指定了任何类型\.*
- 类型捕获组由
(?\w*)
匹配任意数量的单词字符\w*
匹配行的末尾$