【问题标题】:Alphanumeric to numeric only仅字母数字到数字
【发布时间】:2012-04-30 06:35:52
【问题描述】:

寻找将字母数字转换为纯数字字符串的快速/高效方法

例如+123-456/7890 变成 1234567890 等等。

现有代码是

foreach(char c in str.ToCharArray() )
  if ( char.IsDigit(c) ) stringBuilder.Append(c);

return stringBuilder.ToString();

【问题讨论】:

  • 你到底在追求什么?...新想法(例如使用正则表达式)或基准?你为什么要问这个问题 - 只是为了提供信息,还是有真实世界的场景?
  • 我不认为你的方法很慢。如果以速度衡量,应该比正则表达式快得多。我能想象的唯一改进是用 Linq 代替,但不是速度,只有更简洁的代码。
  • @ImranRizvi,这不是重复的,因为他没有问“如何”,而是问“比这更快”。
  • 哦,好吧,你是对的,检查我已经修改了我的答案。

标签: c# .net


【解决方案1】:

LINQ 解决方案:

return new string(str.Where(char.IsDigit).ToArray());

不确定它是否更有效;至少它不是正则表达式!

【讨论】:

    【解决方案2】:
    string str="+123-456/7890";
    long onlyNumbers= Convert.ToInt64(Regex.Replace(str, @"\D", ""));
    

    【讨论】:

    • @Kumar:如果您的号码超出Int32.MaxValue = 2147483647,请使用 Convert.ToInt64(...);这可以给你结果直到Int64.MaxValue = 9223372036854775807
    • @SaeedAmiri,它确实没有那么快,但对我来说使用正则表达式更具可读性和舒适性。
    • @SaeedAmiri:在此处给出的所有答案中,Regex 更快。请参阅我的回答以获得澄清。
    • @ChuckNorris:在此处给出的所有答案中,Regex 更快。请参阅我的回答以获得澄清。
    【解决方案3】:

    是的,RegEx 比其他方法更快,您可以使用 RegexOptions.Compiled 来匹配否定/肯定情况并将它们分开(如果可以存在这样的字符串)使比较更快

    例如

    Regex numberOnlyRegEx = new Regex(@"[^0-9]+", RegexOptions.Compiled);
    
    if (!numberOnlyRegEx.IsMatch(str))
      return 0; //default value;
    
    return Convert.ToInt32(numberOnlyRegEx .Replace(str, "[^0-9]+", ""));
    

    【讨论】:

    • 我使用 Ideone 对其进行了测试,结果完全相反,现在的问题是应该信任 VS-IDE 还是 Ideone?
    • @Marshal 真奇怪,我相信更多关于 VS-IDE 的结果,因为它在您的本地机器上,但不能这么早说。
    【解决方案4】:

    这是另一个解决方案

    string justNumbers = new String(text.Where(Char.IsDigit).ToArray());
    int numbers = Convert.ToInt32(justNumbers); 
    

    【讨论】:

    • 与 Regex 比较 (1 ms) 相比,此过程要慢得多 (4 ms)。虽然它可能不会对应用程序造成太大的伤害,(这只是一个小“研究”)
    【解决方案5】:

    在看到许多尝试在这种情况下不使用正则表达式的答案后,我想说实际上正则表达式在这种特殊情况下的工作速度要快得多。我尝试使用this code snippet

    计算执行时间

    方法建议

    编辑:这些给出了两个完全相反的输出,我不知道我们是否应该完全信任 Ideone 而不是 Visual Studio IDE。

    【讨论】:

    • 元帅,把你的代码放在IDEone,目前我没有什么要测试的,但是这个地方我们俩都可以接受。
    • @SaeedAmiri:好的,我也会试着找到它:)
    • Marshal,只需输入 ideone.com,然后在其中发布您的代码,并在此处留下相关链接。
    • @Saeed Amiri:我使用 Ideone 对其进行了测试,结果符合您的预期,但问题是应该信任 VS-IDE 还是 Ideone?
    • 差别不大,能给我看看你的链接吗?我认为你的测试用例不好,我们应该稍微改变一下。
    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多