2014-12-04 9 views
5

Sto provando a rimuovere i numeri alla fine di una determinata stringa.Rimozione dei numeri alla fine di una stringa C#

AB123 -> AB 
123ABC79 -> 123ABC 

Ho provato qualcosa del genere;

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

Eppure la stringa di sostituzione è la stessa dell'input. Non ho molta familiarità con regex. Posso semplicemente dividere la stringa in un array di caratteri e passarci sopra per farlo, ma non mi sembra una buona soluzione. Qual è una buona pratica per rimuovere i numeri che sono solo alla fine di una stringa?

Grazie in anticipo.

+9

Lo sviluppatore ha un problema. Sa che può risolverlo con un'espressione regolare. Ora ha due problemi. – Oliver

+0

Ho sentito il detto più volte e capisco il punto che fa. Ma cosa suggeriresti invece di regex per questo problema? Fare il ciclo su una schiera di personaggi sembra più sporco. – tdgtyugdyugdrugdr

+2

Forse sembra più sporco, ma sotto la cappa un RegEx non fa altro. E mantenere un'espressione regolare (forse complessa) è molto più sporco, quindi esprimere lo stesso in un ciclo semplice. Non voglio dire: "Non usare mai RegEx.", Ma dovresti forse usarli solo se davvero ne hai bisogno e magari aggiungere un grosso commento con una spiegazione del RegEx, perché tende a essere * scrivi solo * codice. Ah, e prima che dimentichi: scrivi un test unitario per quel metodo che verrà affrontato con un sacco di stringa diversa (magari attraverso un 'TestCaseSource') per assicurarti di non rompere nulla in futuro. – Oliver

risposta

10

Prova questo:

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

Mettere il $ alla fine sarà limitare le ricerche a sottostringhe numeriche alla fine. Quindi, dal momento che stiamo chiamando Regex.Replace, dobbiamo passare il modello di sostituzione come secondo parametro.

Demo

+1

Grazie, questo copre tutte le basi. – tdgtyugdyugdrugdr

2

provare questo:

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

ma si può anche usare un semplice ciclo:

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

Grazie mille Alex, funziona perfettamente! – tdgtyugdyugdrugdr

+1

Nota, tuttavia, che ciò non fa ciò che è stato chiesto: Non rimuove i numeri alla fine dell'input, seleziona la prima sequenza di cifre e conduttanze dall'input! – Heinzi

+0

@Heinzi lo so, ma suggerisco che TS è effettivamente necessario, ma non descrivono bene –

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

caso analizzarlo

16

String.TrimEnd() è più veloce rispetto all'utilizzo di una regex:

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

Benchmark app:

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

Risultato:

regex: 40052843 
trim: 2000635