С# регулярное выражение для захвата всего между двумя двойными кавычками, включая экранированные двойные кавычки

У меня возникают проблемы с написанием регулярного выражения на С#, которое в основном фиксирует все между двумя двойными кавычками. Если эта группа содержит экранированные двойные кавычки, они также будут захвачены. После прочтения вики по регулярным выражениям я все еще не смог написать тот, который полностью выполняет эту работу.

Между разными совпадениями есть символ комы.

Следующая строка:

 "first \"value\\\\", "second, value", "third value"

необходимо дать следующие совпадения:

  • первое \"значение\\\\
  • во-вторых, стоимость
  • третье значение

Спасибо за вашу помощь!


person icykof    schedule 10.05.2018    source источник
comment
Это похоже на данные CSV, существует миллион библиотек и пакетов, которые обрабатывают это. Есть ли причина, по которой вы не можете использовать одну из этих библиотек?   -  person maccettura    schedule 10.05.2018
comment
Похоже, вы работаете с форматом CSV (значения, разделенные запятыми); если это ваш случай, взгляните на Microsoft.VisualBasic.FileIO.TextFieldParser   -  person Dmitry Bychenko    schedule 10.05.2018
comment
Возможный дубликат stackoverflow .com/questions/13024073/   -  person Arpit Gupta    schedule 10.05.2018
comment
См. эту демонстрацию — это то, что вам нужно?   -  person Wiktor Stribiżew    schedule 10.05.2018
comment
Исходная строка немного сложнее, но я извлек ее в пример. Кроме того, я ориентируюсь на несколько фреймворков и подумал, что может быть проще использовать регулярное выражение.   -  person icykof    schedule 10.05.2018
comment
@WiktorStribiżew Да, похоже, он работает так же, как ответ Арпита. Я проанализирую, что они делают, чтобы немного улучшить регулярное выражение. Большое спасибо!   -  person icykof    schedule 10.05.2018
comment
Это упражнение в понимании регулярных выражений или вам нужно решить практическую проблему? Если второе, просто напишите лексер. Это не трудно.   -  person Eric Lippert    schedule 10.05.2018
comment
На самом деле решение Arpit не работает, если первая " является экранированной кавычкой.   -  person Wiktor Stribiżew    schedule 10.05.2018
comment
@WiktorStribiżew, в моем сценарии первого никогда не избежать, так что все должно быть в порядке. Благодарность!   -  person icykof    schedule 10.05.2018


Ответы (1)


Это regex должно решить вашу задачу -

str = Regex.Replace(str, @"(""[^""\\]*(?:\\.[^""\\]*)*"")|", "$1");
person Arpit Gupta    schedule 10.05.2018
comment
Это действительно решает мою проблему. Спасибо за вашу помощь. Я проанализирую регулярное выражение, чтобы попытаться понять, что оно делает. - person icykof; 10.05.2018