2014-12-04 62 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