【问题标题】:Regex to remove all (non numeric OR period)正则表达式删除所有(非数字或句点)
【发布时间】:2011-03-04 14:24:52
【问题描述】:

我需要将“joe ($3,004.50)”之类的文本过滤到 3004.50,但在正则表达式方面表现不佳,找不到合适的解决方案。因此,只有数字和句点应该保留 - 其他所有内容都已过滤。我使用 C# 和 VS.net 2008 框架 3.5

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    应该这样做:

    string s = "joe ($3,004.50)";
    s = Regex.Replace(s, "[^0-9.]", "");
    

    【讨论】:

    • joe.smith ($3,004.50) 怎么样?简单地删除有问题的字符类可能会大错特错。
    • 我做了一个小更正:Regex.Replace(s, "[^$0-9.]", "");你想留下美元符号。
    【解决方案2】:

    正则表达式是:

    [^0-9.]
    

    你可以缓存正则表达式:

    Regex not_num_period = new Regex("[^0-9.]")
    

    然后使用:

    string result = not_num_period.Replace("joe ($3,004.50)", "");
    

    但是,您应该记住,某些文化对书写金额有不同的约定,例如:3.004,50。

    【讨论】:

    • 太懒了 ATM 无法验证,但您不需要转义 . ?
    • @Andrew:不,在字符类中,. 没有特殊含义。
    【解决方案3】:

    对于已接受的答案,MatthewGunn 提出了一个有效点,即整个字符串中的所有数字、逗号和句点都将被压缩在一起。这样可以避免:

    string s = "joe.smith ($3,004.50)";
    Regex r = new Regex(@"(?:^|[^w.,])(\d[\d,.]+)(?=\W|$)/)");
    Match m = r.match(s);
    string v = null;
    if (m.Success) {
      v = m.Groups[1].Value;
      v = Regex.Replace(v, ",", "");
    }
    

    【讨论】:

    • 似乎上面的正则表达式有额外的括号。使用(?:^|[^w.,])(\d[\d,.]+)(?=\W|$) 还将匹配字符串“joe.smith25 ($3,004.50)”中的“h25”
    【解决方案4】:

    你正在处理一个字符串 - 字符串是一个IEumerable<char>,所以你可以使用 LINQ:

    var input = "joe ($3,004.50)";
    var result = String.Join("", input.Where(c => Char.IsDigit(c) || c == '.'));
    
    Console.WriteLine(result);   // 3004.50
    

    【讨论】:

      【解决方案5】:

      删除违规字符的方法可能存在问题。如果字符串中有另一个. 怎么办?它不会被删除,尽管它应该被删除!

      删除非数字或句点,字符串joe.smith ($3,004.50) 将转换为无法解析的.3004.50

      恕我直言,最好匹配特定模式,并使用组提取它。简单的方法是使用正则表达式查找所有连续的逗号、数字和句点:

      [\d,\.]+
      

      示例测试运行:

      Pattern understood as:
      [\d,\.]+
      Enter string to check if matches pattern
      >  a2.3 fjdfadfj34  34j3424  2,300 adsfa    
      Group 0 match: "2.3"
      Group 0 match: "34"
      Group 0 match: "34"
      Group 0 match: "3424"
      Group 0 match: "2,300"
      

      然后对于每个匹配项,删除所有逗号并将其发送到解析器。要处理12.323.344 之类的情况,您可以进行另一次检查以查看匹配的子字符串最多有一个.

      【讨论】:

      • 这个正则表达式匹配所有内容。
      • 它现在匹配除""之外的所有内容。
      • 您提出的概念需要一个难以阅读和调试的复杂正则表达式。最好用几个正则表达式和条件将它分解成几个步骤。我可以提供一个答案(虽然我不知道 c# 是用 Ruby 编写的。
      • @mindriot 点了。我把它改成了更透明的东西。
      • 发送到解析器是指Single.Parse() 还是Single.TryParse
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多