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

时间:2013-01-25 09:53:01

标签: c# regex

我的版本号如下所示。

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

谢谢,

2 个答案:

答案 0 :(得分:3)

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,因为之前的捕获将被下一个捕获。

答案 1 :(得分:0)

用1298和43568替换版本

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

这是因为

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

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

如果您不想保留分离器,您可以这样做

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