Regex.Replace将0添加到转义字符

时间:2017-12-13 10:57:07

标签: c# regex

我想找到单个数字,并为DateTime格式添加“0”。

我尝试了以下代码:

var match = Regex.Replace(@"2017-12-15T8:15:02.000000Z", 
                          @"([^\d])(\d{1})([^\d])",
                          @"$10$2$3");

问题是c#尝试找到匹配的组索引10(因为 $ 10 但是必须 $ 1 和“ 0 ”)可以使用0与逃脱特征?

2 个答案:

答案 0 :(得分:4)

您的主要问题是使用反向引用语法,您可以通过使用大括号包装组ID来轻松修复它,即@"${1}0$2$3"。但是,以后的正则表达式可能还有其他问题。

最安全的做法是使用外观来避免重叠匹配的问题和问题:

var match = Regex.Replace(@"2017-12-15T8:15:02.000000Z", 
                      @"(?<!\d)\d(?!\d)",
                      @"0$&");

请参阅regex demo

enter image description here

Patten详细信息

  • (?<!\d) - 当前位置的左侧不允许数字
  • \d - 任何Unicode数字(如果你传递RegexOptions.ECMAScript选项,它只会匹配ASCII数字)
  • (?!\d) - 当前位置右侧不允许任何数字。

在替换模式中,$&代表整个匹配(不需要用捕获括号包裹\d)。

答案 1 :(得分:1)

使用命名捕获组:

var match = Regex.Replace(@"2017-12-15T8:15:02.000000Z", 
                      @"(?<one>[^\d])(?<two>\d{1})(?<three>[^\d])",
                      @"${one}0${two}${three}");

我主要从如何通过区分$1$10来解决问题的角度来回答。这个答案通过使用无法真正碰撞的命名捕获组来解决问题。

关于您的正则表达式是否最佳,请查看@Wiktor的答案以获取更多信息。

修改

正如@Nyerguds在下面的评论中指出的那样,我们也可以使用{$1}{$2}等,因为这些是默认的捕获组名称。

Demo