Да, я знаю, что регулярное выражение не является «правильным» ответом, но это вопрос, который задан, и мне нравится хорошая проблема с регулярным выражением.
Примечания: Хотя ниже решение, вероятно, может быть адаптированы для других регулярных выражений двигателей, используя его как есть будет требовать, чтобы ваш движок регулярных выражений трактуют multiple named capture groups using the same name одной группы захвата. (.NET делает это по умолчанию)
Когда несколько строк/записи в CSV-файл/поток (сопрягая RFC standard 4180) передаются в регулярном выражении ниже он будет возвращать матч для каждой непустой строки/записи , Каждое совпадение будет содержать группу захвата с именем Value
, которая содержит зафиксированные значения в этой строке/записи (и, возможно, группу захвата OpenValue
, если в конце строки/записи была открытая цитата).
Вот комментируемого шаблон (проверить это on Regexstorm.net):
(?<=\r|\n|^)(?!\r|\n|$) // Records start at the beginning of line (line must not be empty)
(?: // Group for each value and a following comma or end of line (EOL) - required for quantifier (+?)
(?: // Group for matching one of the value formats before a comma or EOL
"(?<Value>(?:[^"]|"")*)"| // Quoted value -or-
(?<Value>(?!")[^,\r\n]+)| // Unquoted value -or-
"(?<OpenValue>(?:[^"]|"")*)(?=\r|\n|$)| // Open ended quoted value -or-
(?<Value>) // Empty value before comma (before EOL is excluded by "+?" quantifier later)
)
(?:,|(?=\r|\n|$)) // The value format matched must be followed by a comma or EOL
)+? // Quantifier to match one or more values (non-greedy/as few as possible to prevent infinite empty values)
(?:(?<=,)(?<Value>))? // If the group of values above ended in a comma then add an empty value to the group of matched values
(?:\r\n|\r|\n|$) // Records end at EOL
Вот исходный шаблон без всех комментариев или пробелов.
(?<=\r|\n|^)(?!\r|\n|$)(?:(?:"(?<Value>(?:[^"]|"")*)"|(?<Value>(?!")[^,\r\n]+)|"(?<OpenValue>(?:[^"]|"")*)(?=\r|\n|$)|(?<Value>))(?:,|(?=\r|\n|$)))+?(?:(?<=,)(?<Value>))?(?:\r\n|\r|\n|$)
Here is a visualization from Debuggex.com (захват группы, названные для ясности):
Примеры о том, как использовать шаблон регулярных выражений можно найти на мой ответ на аналогичный вопрос here, или на C# pad here или here ,
см. Csv для набора данных C# в google? почему вы используете регулярное выражение? – mybirthname