亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 1020 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號