下面是一些没有扩展名的文件名示例,我想从中提取文件的版本和类型。
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 ]
我在这里想念什么? 请提出一些好的正则表达式。 预先感谢!
答案 0 :(得分:1)
您的正则表达式有点不正确,这就是为什么它不起作用的原因。您应该使用正确的正则表达式,
^(?<version>\d+(?:\.\d+)+)(?:\.(?<type>[a-zA-Z]+))?$
这是您的^(?<version>(\d+\.\d+)+)\.(?<type>\w*)$
正则表达式中问题的说明,
您的正则表达式中的此(\d+\.\d+)+
将无法正确捕获版本,因为这将期望输入一个或多个数字类型的数据,然后再次输入文字点,然后再输入一个或多个数字,并将其完整存储一次或多次。此部分的更正版本将是此\d+(?:\.\d+)+
,它可以捕获诸如1.1
或1.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*)$
^
匹配行的开头
版本捕获组由(?<version>[\d+\.]+\d)
[\d+\.]+
匹配1+个数字,后跟.
1次以上\d
匹配最后一位 \.*
匹配在版本号之后是否指定了任何类型
类型捕获组由(?<type>\w*)
\w*
匹配任意数量的单词字符 $
与行尾匹配