Мне нужно регулярное выражение, которое может отделять строку, например:
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++ позволяет оптимизировать код на уровне компиляции для повышения производительности.
Для предоставленных вами образцов будет достаточно следующего регулярного выражения.
(?|\h*"([^\\"]*(?:\\.[^\\"]*)*)"\h*|([^,]+|(?<=,)|^(?=,)))
Посмотрите эту демонстрацию по адресу regex101 (символ \n
в демо предназначен только для многострочной витрины)
Он использует группу сброса ветки для захвата нужных частей той же первой группой, которая поддерживается PCRE и даже регулярным выражением повышения (добавленным в грамматику ECMAScript в версии 1.42).
С помощью этого шаблона охватываются следующие случаи (чередуются, приоритет слева направо)
\h*"([^\\"]*(?:\\.[^\\"]*)*)"\h*
захватывать то, что находится внутри цитируемых частей, окруженных \h*
любым количеством горизонтального пространства, содержащее любое количество экранированных кавычек.[^,]+
части без кавычек: Один или несколько символов, не являющихся запятой.(?<=,)
все оставшиеся пустые места, которым предшествует запятая (просмотр назад).^(?=,)
если в начале ^ начала строки/строки есть пустое место, например. ,a
Обычно рекомендуется использовать csv-парсер, если он доступен в вашей среде.