【问题标题】:Removing numbers at the end of a string C#删除字符串末尾的数字 C#
【发布时间】:2015-02-02 00:56:23
【问题描述】:

我正在尝试删除给定字符串末尾的数字。

AB123 -> AB
123ABC79 -> 123ABC

我尝试过这样的事情;

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

然而替换字符串与输入相同。我对正则表达式不是很熟悉。 我可以简单地将字符串拆分为一个字符数组,然后循环它来完成它,但这并不是一个好的解决方案。删除仅在字符串末尾的数字有什么好的做法?

提前致谢。

【问题讨论】:

  • 开发者有问题。他知道他可以通过正则表达式来解决它。现在他有两个问题。
  • 这句话我听过很多遍了,我明白它的意思。但是对于这个问题,你会建议什么而不是正则表达式?循环遍历字符数组感觉更脏。
  • 也许感觉更脏,但在引擎盖下,RegEx 什么也不做。并且维护一个(可能是复杂的)正则表达式比在一个简单的循环中表达相同的要脏得多。我不想说:“永远不要使用 RegEx。”,但你应该只在你真的需要时才使用它们,也可以添加一个带有 RegEx 解释的大注释,因为它往往是 write只有 代码。啊,在我忘记之前:为该方法编写一个单元测试,该方法将使用许多不同的字符串(可能通过TestCaseSource)来处理,以确保您将来不会破坏任何东西。
  • 感谢 Oliver 的澄清,尤其是单元测试建议非常中肯。

标签: c# regex string substring


【解决方案1】:

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

【讨论】:

  • ...而且凡人也完全可以阅读。
【解决方案2】:

试试这个:

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

将 $ 放在末尾会将搜索限制为末尾的数字子字符串。然后,由于我们调用的是Regex.Replace,所以我们需要将替换模式作为第二个参数传入。

Demo

【讨论】:

  • 谢谢,这涵盖了所有的基础。
  • 这可以在一行中完成:string result = Regex.Replace("123ABC79", @"\d+$", "");
【解决方案3】:

试试这个:

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

【讨论】:

  • 但请注意,这并没有按照要求执行:它不会删除输入末尾的数字,而是从输入中选择第一个数字非数字序列!
  • @Heinzi 我知道,但我认为这是 TS 实际需要的,但没有很好地描述
  • @Heinzi 它解决了我的问题,因为'第一个数字-非数字序列'是我需要的,但你是对的,这不适用于更复杂的字符/数字组合.感谢您的提醒。
  • @Davlumbaz 好的,请参阅任何序列的编辑答案。我认为这更好,因为不要使用慢速替换。
【解决方案4】:

你可以用这个:

string strInput = textBox1.Text;
textBox2.Text = strInput.TrimEnd(new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' });

我从这篇文章中得到它: Simple get string (ignore numbers at end) in C#

【讨论】:

    【解决方案5】:
     (? <=[A-Za-z]*)\d*
    

    应该解析它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多