CSV中双引号值的正则表达式

时间:2014-05-07 20:06:42

标签: c# .net regex

鉴于以下数据,我希望正则表达式提取每个逗号分隔值。但是,双引号值可能包含逗号。

"SMITH, JOHN",1234567890,"12/20/2012,11:00",,DRSCONSULT,DR BOB - OFFICE VISIT - CONSULT,SLEEP CENTER,1234567890,,,"a, b"
"JONES, WILLIAM",1234567890,12/20/2012,12:45,,DRSCONSULT,DR BOB - OFFICE VISIT - CONSULT,SLEEP CENTER,,,,

这是我到目前为止的表达方式:

(?<=^|,)(?:(?:(?<=\")([^\"]*)(?=\"))|(?:(?<![\"])([^,\"]*)(?![\"])))(?=$|,)

Regular expression visualization

Debuggex Demo

双引号值未匹配。我究竟做错了什么? (这个正则表达式被传递给预先存在的代码 - 我无法重写系统。)

3 个答案:

答案 0 :(得分:0)

怎么样:

(?<=^|,)(("[^"]*")|([^,]*))(?=$|,)

Regular expression visualization

Debuggex Demo

第一种选择是:

("[^"]*")

匹配"后跟任何非"后跟"

的内容

第二种选择只是:

([^,]*)

匹配任何非,

的内容

答案 1 :(得分:0)

这种模式应该有效:

(\w+\,\s\w+|[\d\/]*\,\d+\:\d*|[\w\d\:\s\-]+)

示例:

http://regex101.com/r/rI8nS1

在C#中使用模式时,您可能需要将其转义为llke:

Match match = Regex.Match(searchText, "(?m)(?x)(\\w+\\,\\s\\w+|[\\d\\/]*\\,\\d+\\:\\d*|[\\w\\d\\:\\s\\-]+)"); 
    if (match.Success) {...}

答案 2 :(得分:0)

以下是我用于处理引用感知CSV的代码

//regex to translate a CSV
readonly Regex csvParser = new Regex( "(?:^|,)(\\\"(?:[^\\\"]+|\\\"\\\")*\\\"|[^,]*)", RegexOptions.Compiled);

//given a row from the csv file, loop through returning an array of column values
private IEnumerable<string> ProcessCsvRow(string row)
{
    MatchCollection results = csvParser.Matches(row);
    foreach (Match match in results)
    {
        foreach (Capture capture in match.Captures)
        {
            yield return (capture.Value ?? string.Empty).TrimStart(",").Trim('"', ' ');
        }
    }
}