1

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

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

谢谢,

4

2 回答 2

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)+。虽然两者都 match 1234,但第一个将捕获1234到括号创建的组中。第二个将仅捕获4,因为先前的捕获将被下一个覆盖。

于 2013-01-25T10:00:53.797 回答
0

用 1298 和 43568 替换版本

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

这是因为

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

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

如果您不介意保留分隔符,您可以这样做

var regex = new Regex(@"(?<=^(?:\d+[.,]\s*){2})\d+[.,]\s*\d+$");
regex.Replace(source, "1298.43568");
于 2013-01-25T10:26:35.317 回答