2009-10-19 31 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);