十进制数字点的正则表达式而不是逗号(.NET)

时间:2016-05-16 15:37:03

标签: c# .net regex

我正在使用正则表达式解析来自OCR文档的数据,我正在努力匹配1000s逗号分隔符被误读为点的情况,以及点被误读为逗号的地方!

因此,如果真实值为1234567.89,则打印为1,234,567.89但被误读为:

1.234,567.89

1,234.567.89

1,234,567,89

我可以在C#中对此进行排序,但我确信正则表达式可以做到这一点。那些可以提供帮助的正则表达式向导?

更新:

我意识到这是一个非常愚蠢的问题,因为正则表达式非常直接地捕捉所有这些,然后我选择如何解释匹配。哪个将在C#中。谢谢 - 抱歉浪费你的时间!

我将标记答案给德米特里,因为它接近我所寻找的。谢谢。

3 个答案:

答案 0 :(得分:3)

请注意,歧义,因为:

  123,456 // thousand separator 
  123.456 // decimal separator

都是可能的(123456123.456)。但是,我们可以检测到一些情况:

  1. 小数分隔符123.456.789
  2. 太多
  3. 订单错误123.456,789
  4. 错误的数字计数123,45
  5. 所以我们可以设置一个规则:分隔符可以 十进制一个,如果它是 last 一个而没有被跟踪通过完全三位数(参见上面的歧义),全部 其他分隔符应该被视为千分之一:

      1?234?567?89
       ^   ^   ^
       |   |   the last one, followed by two digits (not three), thus decimal 
       |   not the last one, thus thousand  
       not the last one, thus thousand
    

    现在让我们实现一个例行程序

      private static String ClearUp(String value) {
        String[] chunks = value.Split(',', '.');
    
        // No separators
        if (chunks.Length <= 1)    
          return value; 
    
        // Let's look at the last chunk
        // definitely decimal separator (e.g. "123,45")
        if (chunks[chunks.Length - 1].Length != 3) 
          return String.Concat(chunks.Take(chunks.Length - 1)) + 
                 "." + 
                 chunks[chunks.Length - 1]; 
    
        // may be decimal or thousand
        if (value[value.Length - 4] == ',')    
          return String.Concat(chunks);
        else 
          return String.Concat(chunks.Take(chunks.Length - 1)) + 
                 "." + 
                 chunks[chunks.Length - 1]; 
      }
    

    现在让我们尝试一些测试:

       String[] data = new String[] {
         // you tests
         "1.234,567.89",
         "1,234.567.89",
         "1,234,567,89",
    
         // my tests
         "123,456", // "," should be left intact, i.e. thousand separator 
         "123.456", // "." should be left intact, i.e. decimal separator 
       };
    
       String report = String.Join(Environment.NewLine, data
        .Select(item => String.Format("{0} -> {1}", item, ClearUp(item))));
    
       Console.Write(report);
    

    结果是

       1.234,567.89 -> 1234567.89
       1,234.567.89 -> 1234567.89
       1,234,567,89 -> 1234567.89
       123,456 -> 123456
       123.456 -> 123.456
    

答案 1 :(得分:1)

试试这个正则表达式:

\b[\.,\d][^\s]*\b

\ b =字边界 含有:。或逗号或数字 不包含空格

答案 2 :(得分:1)

响应更新/评论:您不需要正则表达式来执行此操作。相反,如果您可以将数字字符串与周围空格隔离,则可以使用Split(',','.')将其拉入字符串数组。根据您在上面概述的逻辑,您可以使用数组的最后一个元素作为小数部分,并将整个部分的第一个元素连接在一起。 (实际代码留作练习......)如果ambiguous-dot-or-comma是字符串中的最后一个字符,这甚至可以工作:split-array中的最后一个元素将为空。

警告:如果总是有一个小数点,这将工作 - 否则,您将无法在数千位逗号和千分之一的小数之间进行逻辑区分。