从文件名与版本号中提取命名分组的正则实现问询
正则表达式验证与优化方案
嘿,我仔细看了你写的正则表达式,发现几个需要调整的地方,刚好能完美匹配你描述的文件名格式,下面一步步说:
原正则的问题点
- 文件名匹配范围不足:你用了
(?<name>\w+),但\w只包含字母、数字和下划线,不支持你要求的-和.,比如遇到my-app.1.2.3这种带连字符的文件名,这部分就会匹配失败。 - 点号未转义:在C#的逐字字符串(
@前缀)里,正则中的.是匹配任意字符的通配符,而你需要的是匹配实际的版本分隔点号,所以必须转义成\.,否则会错误匹配其他字符。 - 可选修订号的点号同样未转义:原正则里
(.(?<rev>[0-9]{1,9}))?中的.也是通配符,同样需要转义才能匹配真实的点号。
优化后的正则表达式
var regexPattern = @"(?<name>[a-zA-Z0-9_\-\.]+)\.(?<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);
各分组说明
(?<name>[a-zA-Z0-9_\-\.]+):精准匹配你允许的文件名字符(字母、数字、下划线、连字符、点号),+确保文件名至少有一个字符(如果需要允许空文件名,可以改成*,但通常文件名不会为空)。\.(?<major>[0-9]{1,9}):转义后的点号匹配版本分隔符,后面的[0-9]{1,9}匹配1-9位数字的主版本号,minor和hotfix分组逻辑完全一致。(\.(?<rev>[0-9]{1,9}))?:整个分组标记为可选(末尾的?),内部转义的点号加上1-9位数字的修订号,完美支持你说的rev可选字段。
测试案例
匹配成功的场景
my_app.1.2.3→ 提取结果:name=my_app,major=1,minor=2,hotfix=3,rev=nullmy.app-with-dashes.123456789.987654321.111111111.999999999→ 所有分组都能正确提取simpleName.0.0.0→ 支持全0的版本号(如果需要限制版本号不能以0开头,可以把[0-9]{1,9}改成[1-9][0-9]{0,8},但你没提这个要求,所以保持原逻辑)
预期匹配失败的场景
invalid!name.1.2.3→ 文件名包含非法字符(!),不匹配missing.version.1.2→ 缺少hotfix版本号,不匹配
内容的提问来源于stack exchange,提问作者Frank Q.




