You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

从文件名与版本号中提取命名分组的正则实现问询

正则表达式验证与优化方案

嘿,我仔细看了你写的正则表达式,发现几个需要调整的地方,刚好能完美匹配你描述的文件名格式,下面一步步说:

原正则的问题点

  • 文件名匹配范围不足:你用了(?<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位数字的主版本号,minorhotfix分组逻辑完全一致。
  • (\.(?<rev>[0-9]{1,9}))?:整个分组标记为可选(末尾的?),内部转义的点号加上1-9位数字的修订号,完美支持你说的rev可选字段。

测试案例

匹配成功的场景

  • my_app.1.2.3 → 提取结果:name=my_appmajor=1minor=2hotfix=3rev=null
  • my.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.

火山引擎 最新活动