为了账号安全,请及时绑定邮箱和手机立即绑定

C#,正则表达式:如何解析逗号分隔的值,其中某些值可能用引号引起来,字符串本身包含逗号

C#,正则表达式:如何解析逗号分隔的值,其中某些值可能用引号引起来,字符串本身包含逗号

月关宝盒 2019-12-03 10:55:24
在C#中,使用Regex该类,如何解析逗号分隔的值,其中某些值可能被引号括起来的包含逗号的字符串本身?using System ;using System.Text.RegularExpressions ;class  Example    {    public static void Main ( )        {        string  myString  =  "cat,dog,\"0 = OFF, 1 = ON\",lion,tiger,'R = red, G = green, B = blue',bear" ;        Console.WriteLine ( "\nmyString is ...\n\t" + myString + "\n" ) ;        Regex   regex  =  new Regex  (  "(?<=,(\"|\')).*?(?=(\"|\'),)|(^.*?(?=,))|((?<=,).*?(?=,))|((?<=,).*?$)"  )  ;        Match   match  =  regex.Match ( myString ) ;        int j = 0 ;        while ( match.Success )            {            Console.WriteLine ( j++ + " \t" + match ) ;            match  =  match.NextMatch() ;            }        }    }输出(部分)如下所示:0       cat1       dog2       "0 = OFF3        1 = ON"4       lion5       tiger6       'R = red7        G = green8        B = blue'9       bear但是,所需的输出是:0       cat1       dog2       0 = OFF, 1 = ON3       lion4       tiger5       R = red, G = green, B = blue6       bear
查看完整描述

3 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

尝试使用此正则表达式:


"[^"\r\n]*"|'[^'\r\n]*'|[^,\r\n]*

    Regex regexObj = new Regex(@"""[^""\r\n]*""|'[^'\r\n]*'|[^,\r\n]*");

    Match matchResults = regexObj.Match(input);

    while (matchResults.Success) 

    {

        Console.WriteLine(matchResults.Value);

        matchResults = matchResults.NextMatch();

    }


“ 0 = OFF,1 = ON”

狮子

'R =红色,G =绿色,B =蓝色'

注意:此正则表达式解决方案适用于您的情况,但是我建议您使用专用的库,例如FileHelpers。


查看完整回答
反对 回复 2019-12-03
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

为什么不听从专家的建议,不要滚动自己的CSV解析器。


您的第一个想法是,“我需要在引号内处理逗号”。


您的下一个想法是,“哦,糟糕,我需要处理引号内的引号。转义的引号。双引号。单引号...”


这是通往疯狂的道路。不要自己写。查找具有广泛的单元测试覆盖面的库,该库涉及所有困难部分,并为您解决了所有困难。对于.NET,请使用免费的开源FileHelpers库。


查看完整回答
反对 回复 2019-12-03
?
慕森卡

TA贡献1806条经验 获得超8个赞

只需添加我今天上午工作的解决方案。


var regex = new Regex("(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)");


foreach (Match m in regex.Matches("<-- input line -->"))

{

    var s = m.Value; 

}

如您所见,您需要每行调用regex.Matches()。然后,它将返回MatchCollection,其中具有与列相同数量的项目。显然,每个匹配项的Value属性都是解析后的值。


这项工作仍在进行中,但它很乐意解析CSV字符串,例如:


2,3.03,"Hello, my name is ""Joshua""",A,B,C,,,D


查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 903 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信