【问题标题】:Split string with comma delimiter but not if it is a currency value using C#使用逗号分隔符分割字符串,但如果它是使用 C# 的货币值则不分割
【发布时间】:2015-06-05 05:15:42
【问题描述】:

我必须拆分一个包含正常值和货币值的字符串

i.e. aaa,bbb,$33,222,ccc,$22,000

预期输出:

-aaa
-bbb
-$33,222
-ccc
-$22,000

【问题讨论】:

    标签: c# regex split


    【解决方案1】:

    根据下面的正则进行拆分。

    @",(?!\d)"
    

    这将匹配所有不跟数字的逗号。 (?!\d) 断言匹配后不能跟数字。

    DEMO

    在 c# 中这应该可以工作。

    @"(?<!\$\d+),(?!\d+)"
    

    【讨论】:

    • 你能解释一下这个正则表达式吗?
    • @pikachu 这将在aaa,123 的情况下中断你想要吗?
    • 我不想这样,我的字符串是这样的:aaa,$12,000,12345,bbb,56789,ccc 我希望最终的数组是这样的:-aaa - $12000 -12345 -bbb -56789 -ccc
    • @pikachu 我认为我的更新将为您提供上述输入所期望的输出。
    • @AvinashRaj 猜测您应该删除旧答案,因为它没有满足 OP 的期望
    【解决方案2】:

    只是为某些品种提供非正则表达式答案。您可以执行以下操作:

    String[] MySplit(String str)
    {
        bool currency = false;
        char[] chars = str.ToCharArray();
    
        for(int i = 0; i < str.Length(); ++i)
        {
           if(chars[i] == '$')
              currency=true;
           else
           if(currency && chars[i] == ',')
           {
               chars[i] = '.';
               currency = false;
           }
        }
        return new String(chars).Split(",");
    }
    

    这会将货币逗号替换为句号或您想要的任何内容,以便您可以轻松地将字符串拆分为逗号。拥有令牌后,您始终可以将其改回逗号。请注意,这仅在货币值始终包含小数的假设下有效。

    【讨论】:

    • @pikachu 太棒了。如果您最终使用它,请记住接受它;)
    【解决方案3】:

    我建议抓取而不是拆分。

    (\$\d+(?:,\d+)*(?:\.\d+)*)|([^,\n]+)
    

    试试这个。查看演示。您可以稍后将- 附加到每个capturegroup 结果。

    https://regex101.com/r/nS2lT4/14

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 1970-01-01
      相关资源
      最近更新 更多