【问题标题】:Simple get string (ignore numbers at end) in C#C#中的简单获取字符串(忽略末尾的数字)
【发布时间】:2009-09-27 19:02:52
【问题描述】:

我认为正则表达式是多余的,而且我需要一些时间来编写一些代码(我想我现在应该学习一些正则表达式)。

在字母数字字符串中分隔字符串的最简单方法是什么? 它总是 LLLLDDDDD。我只想要字母(l),通常只有 1 或 2 个字母。

【问题讨论】:

  • 多年来我一直拒绝学习正则表达式。不要做我。

标签: c# text-parsing


【解决方案1】:

TrimEnd:

string result = input.TrimEnd(new char[]{'0','1','2','3','4','5','6','7','8','9'});
// I'm sure using LINQ and Range can simplify that.
// also note that a string like "abc123def456" would result in "abc123def"

但是正则表达式也很简单:

string result = Regex.Match(input,@"^[^\d]+").Value;

【讨论】:

  • 并非所有正则表达式都必须复杂。事实上,一些更复杂的代码有时可以更好地替换为传统的代码结构。只知道几个概念(字符类、回溯、命名组)就足以有效地解决许多日常字符串处理问题 - 绝对值得学习基础知识!
  • RegEx 解决方案不起作用。对于输入: asfsdf23424Aasdfsf222 它将输出 asfsdf。它应该是 asfsdf23424Aasdfsf
【解决方案2】:

我更喜欢 Michael Stum 的正则表达式答案,但这里也是一种 LINQ 方法:

string input = "ABCD1234";
string result = new string(input.TakeWhile(c => Char.IsLetter(c)).ToArray());

【讨论】:

  • 非常好的答案。但并未涵盖所有基础:它从开头开始,仅认为字母字符有效,并在 first 无效发生处停止,这将失败(取决于您的要求),例如 input = "ABCD1234EFGH5678"
【解决方案3】:

您可以使用匹配数字的正则表达式来删除它们:

input = Regex.Replace(input, "\d+$", String.Empty);

老式的循环也不错,它实际上应该是最快的解决方案:

int len = input.Length;
while (input[len-1] >= '0' && input[len-1] <= '9') len--;
input = input.Substring(0, len);

【讨论】:

  • 那个 ^ 应该是一个 $ - 否则你在字符串开始之前匹配数字;)
【解决方案4】:

他们明白了 - 请注意,好的解决方案使用 not 运算符来使用您的问题描述:“不是数字”如果您在前面有数字,从我的有限收益看来,您必须拥有所谓的捕获组越过字符串前端的任何内容。我现在使用的设计范式不是分隔符,后跟分隔符,后跟左大括号。

这导致需要一个不在结果集中的分隔符,一方面可以很好地为数据分隔符建立 ascii 值,例如 0x0019 / 0x0018 等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多