首页 > 解决方案 > c# 地址的正则表达式

问题描述

我有一个来自 csv 文件的字符串。我试图从引号之间的值中删除逗号,但前提是它不是数字。

例如,我有这个字符串。

6/4/2020,11111,John,Doe,"111 st , city,State",city,st,11111,email@gmail.com,11111111111,11111111111,"$370,000.00","$500,000.00 ",blah blah blah,"$370,000.00 ",4.25%,stable,74.00%,Rate and Term,0.00%,$0.00 ,Good,No

上面的st地址是

"111 st , city,State"

我可以用这个正则表达式删除引号之间的逗号

var regex = new Regex("\\\"(.*?)\\\"");

但是,这也删除了数字中的逗号

"$370,000.00"

如何删除地址中的逗号,但忽略带有美元符号 $ 的数字字段?

这是一个示例代码

    var test = $"6/4/2020,test,test,testJR,\"111 test DRIVE, city, st\",city,st,11111,test@gmail.com,11111,11111,\"$370,000.00 \",\"$500,000.00 \",Single Family Residence,\"$370,000.00 \",4.25%,Fixed,74.00%,Rate and Term,0.00%,$0.00 ,Good,No";
    var regex = new Regex("\\\"(.*?)\\\"");
    test = regex.Replace(test, m => m.Value.Replace(',', ' '));

标签: c#regex

解决方案


您可以使用

var regex = new Regex(@"""\s*\$\d+(?:,\d+)*(?:\.\d+)?\s*""|(""[^""]*"")");
test = regex.Replace(test, m => m.Groups[1].Success ? 
    m.Groups[1].Value.Replace(',', ' ') : m.Value);

查看C# 演示

细节

  • "\s*\$\d+(?:,\d+)*(?:\.\d+)?\s*"
    • "\s*\$- ",然后是 0+ 个空格,然后是$char
    • \d+(?:,\d+)*(?:\.\d+)?- 1+ 位,然后是 0 次或多次逗号,然后是 1+ 位,然后是可选的 a.和 1+ 位
    • \s*" - 0+ 个空格,然后"
  • | - 或者
  • ("[^"]*")- 捕获第 1 组: ,除然后"之外的零个或多个字符。""

m => m.Groups[1].Success ? m.Groups[1].Value.Replace(',', ' ') : m.Value)意味着仅当捕获组 1 匹配时,逗号才会替换为空格,否则,匹配项将按原样返回。


推荐阅读