2009-10-19 30 views
0

我有一个字符串。我想用“dd”替换“d”,使用Regex.Replace,但只有在d不重复的情况下。如何通过.Net正则表达式替换非重复字符

例如,如果字符串是“m/d/yy”,我想将其更改为“m/dd/yy”。但是,如果字符串是“m/dd/yy”,我想保持不变,而不是将其更改为“m/dddd/yy”。

我该怎么做?我试过Reg.Replace(datePattern,“\ bd \ b”,“dd”),但那似乎不起作用。

+0

顺便说一句 - 你知道,在字符串反斜杠不得不为了使它的正则表达式引擎进行转义,对不对? – ephemient 2009-10-19 23:47:39

+0

如果你的正则表达式中有反斜杠(或者即使你没有,那也是好习惯),在字符串的前面加一个&符号来使用逐字字符串文字。 @“(。)(?!\ 1)”(?!\ 1)“ – 2009-10-20 00:20:05

+0

”&“看起来更像'&'而不是'@' - 但是,使用'@”字符串“'是一种好的做法。 – ephemient 2009-10-20 00:49:46

回答

1
(.)(?<!\1.)(?!\1) 

字面意思是“字符,不是先于本身,也不是后面本身”。

+0

这个答案最直接的解决了这个问题,我不确定.NET正则表达式是否支持零宽度断言,但是我查了它并确实如此。 – Tim 2009-10-19 23:47:12

+0

它甚至应该作为'(?<!\ 1)(。)(?!\ 1)' - 即使在捕获组之前引用了\ 1。至少在.NET,Perl和Java中,不在Python,JavaScript(可能还有其他)中。 – 2009-10-20 15:04:16

0

我认为你是正确的;尽管您可能错误地转义了字符。尝试:

Regex.Replace(datePattern, "\\bd\\b", "dd") 
+0

这是问题所在。谢谢! – ATDev 2009-10-20 04:42:32

0

我觉得这会为你正在尝试做的工作:

Reg.Replace(datePattern, "/d/", "/dd/") 
1

您可以使用lookahead and lookbehind检查由其他每个d没有前面或后面:

Regex.Replace(datePattern, "(?<!d)d(?!d)", "dd") 

对于您的问题中的特定示例,纯正字符串替换比使用正则表达式更直接:datePattern.Replace("/d/", "/dd/")。我猜你的实际需求比较复杂,因此是正则表达式。

+0

你和我的区别在于你找到一个'd',而我发现一个单一的任何角色。邓诺更适合OP的需求。 – ephemient 2009-10-20 01:21:23

+0

这可用作解决方案。谢谢! – ATDev 2009-10-20 04:55:35

0

一个更简单的方法是这样的:

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);