我有一个字符串。我想用“dd”替换“d”,使用Regex.Replace,但只有在d不重复的情况下。如何通过.Net正则表达式替换非重复字符
例如,如果字符串是“m/d/yy”,我想将其更改为“m/dd/yy”。但是,如果字符串是“m/dd/yy”,我想保持不变,而不是将其更改为“m/dddd/yy”。
我该怎么做?我试过Reg.Replace(datePattern,“\ bd \ b”,“dd”),但那似乎不起作用。
我有一个字符串。我想用“dd”替换“d”,使用Regex.Replace,但只有在d不重复的情况下。如何通过.Net正则表达式替换非重复字符
例如,如果字符串是“m/d/yy”,我想将其更改为“m/dd/yy”。但是,如果字符串是“m/dd/yy”,我想保持不变,而不是将其更改为“m/dddd/yy”。
我该怎么做?我试过Reg.Replace(datePattern,“\ bd \ b”,“dd”),但那似乎不起作用。
(.)(?<!\1.)(?!\1)
字面意思是“字符,不是先于本身,也不是后面本身”。
这个答案最直接的解决了这个问题,我不确定.NET正则表达式是否支持零宽度断言,但是我查了它并确实如此。 – Tim 2009-10-19 23:47:12
它甚至应该作为'(?<!\ 1)(。)(?!\ 1)' - 即使在捕获组之前引用了\ 1。至少在.NET,Perl和Java中,不在Python,JavaScript(可能还有其他)中。 – 2009-10-20 15:04:16
我认为你是正确的;尽管您可能错误地转义了字符。尝试:
Regex.Replace(datePattern, "\\bd\\b", "dd")
这是问题所在。谢谢! – ATDev 2009-10-20 04:42:32
我觉得这会为你正在尝试做的工作:
Reg.Replace(datePattern, "/d/", "/dd/")
您可以使用lookahead and lookbehind检查由其他每个d
没有前面或后面:
Regex.Replace(datePattern, "(?<!d)d(?!d)", "dd")
对于您的问题中的特定示例,纯正字符串替换比使用正则表达式更直接:datePattern.Replace("/d/", "/dd/")
。我猜你的实际需求比较复杂,因此是正则表达式。
一个更简单的方法是这样的:
Regex regex = new Regex(@"/(d|ddd)/");
string replacement = "/$1d/";
string updated = regex.Replace("m/d/yy", replacement);
string updated2 = regex.Replace("m/ddd/yy", replacement);
string notUpdated = regex.Replace("m/dd/yy", replacement);
string notUpdated2 = regex.Replace("m/dddd/yy", replacement);
顺便说一句 - 你知道,在字符串反斜杠不得不为了使它的正则表达式引擎进行转义,对不对? – ephemient 2009-10-19 23:47:39
如果你的正则表达式中有反斜杠(或者即使你没有,那也是好习惯),在字符串的前面加一个&符号来使用逐字字符串文字。 @“(。)(?!\ 1)”(?!\ 1)“ – 2009-10-20 00:20:05
”&“看起来更像'&'而不是'@' - 但是,使用'@”字符串“'是一种好的做法。 – ephemient 2009-10-20 00:49:46