我想找到单个数字,并为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与逃脱特征?
答案 0 :(得分:4)
您的主要问题是使用反向引用语法,您可以通过使用大括号包装组ID来轻松修复它,即@"${1}0$2$3"
。但是,以后的正则表达式可能还有其他问题。
最安全的做法是使用外观来避免重叠匹配的问题和问题:
var match = Regex.Replace(@"2017-12-15T8:15:02.000000Z",
@"(?<!\d)\d(?!\d)",
@"0$&");
请参阅regex demo
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}
等,因为这些是默认的捕获组名称。