用于更新版本号的正则表达式

本文关键字:正则表达式 版本号 更新 用于 | 更新日期: 2023-09-27 17:55:49

我有一个版本号,如下所示。

020. 000. 1234. 43567 (please note the whitespace after the dot(.))
020,000,1234,43567
20.0.1234.43567
20,0,1234,43567

我想要一个正则表达式来更新最后两个点(.)之后的数字,例如 1298 和 45678(任何数字)

020. 000. 1298. 43568 (please note the whitespace after the dot(.))
020,000,1298,45678
20.0.1298.45678
20,0,1298,45678

谢谢

用于更新版本号的正则表达式

resultString = Regex.Replace(subjectString, 
    @"('d+)    # any number
    ([.,]'s*)  # dot or comma, optional whitespace
    ('d+)      # etc.
    ([.,]'s*)
    'd+
    ([.,]'s*)
    'd+", 
    "$1$2$3${4}1298${5}43568", RegexOptions.IgnorePatternWhitespace);

请注意${4}而不是$4,否则以下1将被解释为属于组号 ( $41 )。

另请注意('d+)('d)+之间的区别。当两者都匹配1234时,第一个将捕获1234到由括号创建的组中。第二个将仅捕获4,因为之前的捕获将被下一个捕获覆盖。

将版本替换为 1298 和 43568

var regex = new Regex(@"(?<=^(?:'d+[.,]'s*){2})'d+(?<seperator>[.,]'s*)'d+$");
regex.Replace(source, "1298${seperator}43568");

这是因为

  • (?<=)不包括匹配中的组,但要求它在匹配之前存在
  • ^匹配字符串的开头,后跟至少一个数字
  • (?:'d+[.,]'s*)非捕获组,请至少匹配一个数字,后跟一个.,后跟 0 个或多个空格
  • {2}前一场比赛应该发生两次
  • 'd+捕获的第一部分,1 位或多位数字
  • (?<seperator>[.,]'s*)获取.,的分隔符,后跟可选空格,进入名为 seperator 的命名捕获组
  • 'd+捕获一个或多个数字
  • $匹配字符串的结尾

在替换字符串中,您只需提供替换版本并使用${seperator}插入原始分隔符。

如果您不为保留分隔符而烦恼,您可以这样做

var regex = new Regex(@"(?<=^(?:'d+[.,]'s*){2})'d+[.,]'s*'d+$");
regex.Replace(source, "1298.43568");