鉴于以下数据,我希望正则表达式提取每个逗号分隔值。但是,双引号值可能包含逗号。
"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,,,,
这是我到目前为止的表达方式:
(?<=^|,)(?:(?:(?<=\")([^\"]*)(?=\"))|(?:(?<![\"])([^,\"]*)(?![\"])))(?=$|,)
双引号值未匹配。我究竟做错了什么? (这个正则表达式被传递给预先存在的代码 - 我无法重写系统。)
答案 0 :(得分:0)
怎么样:
(?<=^|,)(("[^"]*")|([^,]*))(?=$|,)
第一种选择是:
("[^"]*")
匹配"
后跟任何非"
后跟"
第二种选择只是:
([^,]*)
匹配任何非,
答案 1 :(得分:0)
这种模式应该有效:
(\w+\,\s\w+|[\d\/]*\,\d+\:\d*|[\w\d\:\s\-]+)
示例:强>
在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('"', ' ');
}
}
}