Регулярное выражение для текста, разделенного запятыми, с необязательными двойными кавычками, которые могут содержать кавычки, экранированные обратной косой чертой

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

1st, 2nd=second, "3rd=third","4th = forth",,"6th=\"this, is, the, sixth\""

в

1st         // not surrounded
2nd=second  // not surrounded
3rd=third   // surrounded
4th = forth // surrounded, keep the blank in the middle
            // empty string
6th = "this, is, the, sixth"    // the scaped dbl-quotes and commas in the middle should be kept

обратите внимание: если в разделах нет запятых или двойных кавычек, они могут быть заключены или не заключены в окружение, но если в них есть специальные символы, они должны быть заключены в окружение, а двойные кавычки должны быть заключены в обратную косую черту. Кроме того, следует сохранить пустые значения (например, пятое).

Будем благодарны за любую помощь.

🤔 А знаете ли вы, что...
C++ позволяет оптимизировать код на уровне компиляции для повышения производительности.


2
70
1

Ответ:

Решено

Для предоставленных вами образцов будет достаточно следующего регулярного выражения.

(?|\h*"([^\\"]*(?:\\.[^\\"]*)*)"\h*|([^,]+|(?<=,)|^(?=,)))

Посмотрите эту демонстрацию по адресу regex101 (символ \n в демо предназначен только для многострочной витрины)

Он использует группу сброса ветки для захвата нужных частей той же первой группой, которая поддерживается PCRE и даже регулярным выражением повышения (добавленным в грамматику ECMAScript в версии 1.42).

С помощью этого шаблона охватываются следующие случаи (чередуются, приоритет слева направо)

  1. \h*"([^\\"]*(?:\\.[^\\"]*)*)"\h*захватывать то, что находится внутри цитируемых частей, окруженных \h* любым количеством горизонтального пространства, содержащее любое количество экранированных кавычек.
  2. [^,]+ части без кавычек: Один или несколько символов, не являющихся запятой.
  3. (?<=,) все оставшиеся пустые места, которым предшествует запятая (просмотр назад).
  4. ^(?=,) если в начале ^ начала строки/строки есть пустое место, например. ,a

Обычно рекомендуется использовать csv-парсер, если он доступен в вашей среде.