2014-12-04 95 views
5

我試圖刪除給定字符串末尾的數字。刪除字符串C末尾的數字#

AB123 -> AB 
123ABC79 -> 123ABC 

我試過類似的東西;

string input = "123ABC79"; 
string pattern = @"^\\d+|\\d+$"; 
string replacement = ""; 
Regex rgx = new Regex(pattern); 
string result = rgx.Replace(input, replacement); 

然而,替換字符串與輸入相同。我對正則表達式不是很熟悉。 我可以簡單地將字符串分割成一個字符數組,然後遍歷它來完成它,但它不是一個好的解決方案。刪除僅在字符串末尾的數字的最佳做法是什麼?

在此先感謝。

+9

開發商有問題。他知道他可以通過正則表達式來解決它。現在他有兩個問題。 – Oliver 2014-12-04 08:12:31

+0

我已經多次聽到這個說法,並且我理解它的重點。但是,你會建議,而不是正則表達式來解決這個問題?循環訪問字符數組會感覺更加骯髒。 – tdgtyugdyugdrugdr 2014-12-04 08:18:58

+2

也許感覺更骯髒,但在引擎蓋下RegEx沒有任何其他。保持一個(也許是複雜的)正則表達式更加骯髒,然後在一個簡單的循環中表達相同的內容。我不想說:「永遠不要使用正則表達式」,但是您也許應該只在真正需要時才使用它們,並且可能會在RegEx的解釋中添加一條重要評論,因爲它往往只是*只寫*碼。嗯,在我忘記之前:爲這個方法編寫一個單元測試,將用很多不同的字符串(可能通過'TestCaseSource')來處理,以確保你將來不會破壞任何東西。 – Oliver 2014-12-04 08:27:13

回答

10

試試這個:

string input = "123ABC79"; 
string pattern = @"\d+$"; 
string replacement = ""; 
Regex rgx = new Regex(pattern); 
string result = rgx.Replace(input, replacement); 

把$在年底將搜索限制數字子串在最後。然後,由於我們調用Regex.Replace,我們需要傳入替換模式作爲第二個參數。

Demo

+1

謝謝,這涵蓋了所有的基地。 – tdgtyugdyugdrugdr 2014-12-04 08:27:27

2

試試這個:

string input = "123ABC79"; 
string pattern = @".+\D+(?=\d+)"; 
Match match = Regex.Match(input, pattern); 
string result = match.Value; 

,但你也可以使用一個簡單的循環:

string input = "123ABC79"; 
int i = input.Length - 1; 
for (; i > 0 && char.IsDigit(input[i - 1]); i--) 
{} 
string result = input.Remove(i); 
+0

非常感謝Alex,這個作品非常完美! – tdgtyugdyugdrugdr 2014-12-04 08:15:09

+1

但是,請注意,這不會執行所要求的操作:它不會刪除輸入末尾的數字,它會從輸入中選擇第一個數字 - 非數字序列! – Heinzi 2014-12-04 08:18:08

+0

@Heinzi我知道,但我建議這是什麼TS是真正需要的,但沒有很好地描述 – 2014-12-04 08:20:14

1
(? <=[A-Za-z]*)\d* 

應該解析它

16

String.TrimEnd()比使用一個正則表達式更快:

var digits = new[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; 
var input = "123ABC79"; 
var result = input.TrimEnd(digits); 

基準應用程式:

string input = "123ABC79"; 
    string pattern = @"\d+$"; 
    string replacement = ""; 
    Regex rgx = new Regex(pattern); 

    var iterations = 1000000; 
    var sw = Stopwatch.StartNew(); 
    for (int i = 0; i < iterations; i++) 
    { 
     rgx.Replace(input, replacement); 
    } 

    sw.Stop(); 
    Console.WriteLine("regex:\t{0}", sw.ElapsedTicks); 

    var digits = new[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; 
    sw.Restart(); 
    for (int i = 0; i < iterations; i++) 
    { 
     input.TrimEnd(digits); 
    } 

    sw.Stop(); 
    Console.WriteLine("trim:\t{0}", sw.ElapsedTicks); 

結果:

regex: 40052843 
trim: 2000635