2012-10-15 53 views
2

我需要從表達式的數字部分中刪除前導零(使用.net 2.0 C#正則表達式類)。正則表達式 - 刪除表達式中的零

例:

PAR0000034 - > PAR34

WP0003204 - > WP3204

我試過如下:

//keep starting characters, get rid of leading zeroes, keep remaining digits 
string result = Regex.Replace(inputStr, "^(.+)(0+)(/d*)", "$1$3", RegexOptions.IgnoreCase) 

顯然沒有奏效。我需要一些幫助來發現錯誤。

+0

轉義不是正斜槓'/',它應該是倒退''''' – TheZ

回答

3

你並不需要一個正則表達式爲此,Split方法可以爲你做到這一點。

拆分'0',刪除空的條目(即多個零之間),並將結果限制爲兩個字符串將給出前導零之前和之後的兩個字符串。然後,你只要把那兩個串在一起再次:

string result = String.Concat(
    input.Split(new char[] { '0' }, 2, StringSplitOptions.RemoveEmptyEntries) 
); 
+0

-1這不適用於AB001002和其他輸入具有兩個隨後的非前導零.. –

+0

@MichalKlouda:你錯了。它工作得很好,爲自己嘗試。通過輸入「AB001002」,結果是「AB1002」。 – Guffa

+0

@MichalKlouda - 注意',2'。 – Kobi

3

在你的表達中.*部分是貪婪的,所以它捕獲完整的字符串。另外 用反斜槓代替斜槓數字\d

string result = Regex.Replace(inputStr, @"^([^0]+)(0+)(\d*)", "$1$3"); 

或使用,而不是向後看:

string result = Regex.Replace(inputStr, "(?<=[a-zA-Z])0+", ""); 
+0

好抓,仍然xpression不起作用。這個表達式的結果仍然會修改輸入str。 – ActiveX

+0

更新了我的答案..沒有看到。*第一眼看到的問題.. –

+0

謝謝,現在工作!謝謝大家的迴應。 – ActiveX

0

這個工作對我來說:

Regex.Replace("PPP00001001", "([^0]*)0+(.*)", "$1$2"); 
0

短語「前導零」是混亂的,因爲你談論的零實際上並不在該字符串的開頭。但是,如果我理解正確的話,你想這樣:

string result = Regex.Replace(inputStr, "^(.*?)0+", "$1"); 

實際上,有幾種方法可以做到這一點,使用和不使用正則表達式,但可能高於最短,最容易理解的。重要的部分是懶惰的量詞.*?。這將確保a)僅找到第一個零的字符串,並且b)刪除字符串中的所有「前導」零。

+0

我的意思是引導零,在alpha字符之後總是領先數字。謝謝你的工作。一個簡單的問題:替換函數中的$ 1是什麼,找不到一個好的答案。 – ActiveX

+0

'$ 1'的意思是「無論在第一對括號內是否匹配」,在這種情況下是「(。*?)」。所以當你在'PAR0000034'上使用它時,正則表達式匹配'PAR00000',然後拋出'00000'並保留'PAR'。 –

+0

謝謝,這是有道理的。 – ActiveX