从文件名和版本中提取命名组

时间:2018-04-21 06:12:50

标签: .net regex regular-language

我有以下情况,其中文件名可以是以下格式

filename.majorver.minorver.hotfix.rev

filename =可以包含- _.

的字母数字

majorver,minorver,hotifx =仅限1到9位数

rev =可以存在与否,但如果只存在1到9位数

我对命名组的正则表达式如下

 var regexPattern = @"(?<name>\w+).(?<major>[0-9]{1,9}).(?<minor>[0-9]{1,9}).(?<hotfix>[0-9]{1,9})(.(?<rev>[0-9]{1,9}))?";
 var regex = new Regex(regexPattern);

 var match = regex.Match("somefile.10000.210");

 var name = match.Groups["name"].Value;
 var major = match.Groups["major"].Value;
 var minor = match.Groups["minor"].Value;
 var hotfix = match.Groups["hotfix"].Value;
 var rev = match.Groups["rev"].Value;

由于某些原因,即使需要hotfix,上述匹配也会通过。我无法通过以下案件

a)filename.ext.10.2.12

b)filename.ext.10.2.12.3

c)filename-name.10.2。

知道如何处理这个问题吗?

1 个答案:

答案 0 :(得分:0)

如果您不应用边界,则只要有引擎,引擎就会开始匹配。所以你必须选择。如果文件名每个都是单独的输入,或者每个文件名都在一个单独的行上使用(如果后者是这样,则启用m标志):

^REGEX$

或者如果它们在文本中的每个位置:

(?<!\S)REGEX(?!\S)

你也必须逃避点。

  

filename =可以包含- _.

的字母数字

您没有将这些字符添加到字符类中。你应该包括它们:

(?<name>[\w.-]+?)
               ^ Lazy quantifier

修改后的正则表达式:

^(?<name>[\w.-]+?)\.(?<major>[0-9]{1,9})\.(?<minor>[0-9]{1,9})\.(?<hotfix>[0-9]{1,9})(\.(?<rev>[0-9]{1,9}))?$

Live demo