Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式查找文件版本C#_Regex_File_Version_Regex Group - Fatal编程技术网

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

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*)$ 但这不起作用 使用

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

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*)$

但这不起作用

使用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)

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

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

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