我有以下情况,其中文件名可以是以下格式
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。
知道如何处理这个问题吗?
答案 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}))?$