Что нового

Регулярное выражение для разбора csv строки

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Помогите с регуляркой что бы из строки содержацие 4 значения разделенные ; получилось 4 элемента массива:
Вот экранированная строка: 2;"2"",2;2";3;4
Должно быть:
2
2",2;2
3
4

Правила экранирования такие:
1) Значения, содержащие зарезервированные символы (двойная кавычка, запятая, точка с запятой, новая строка) обрамляются двойными кавычками (");
2) если в значении встречаются кавычки — они представляются в файле в виде двух кавычек подряд.


Добавлено:
Сообщение автоматически объединено:

Или подскажите готовый парсер, можно в виде dll
 

sngr

AutoIT Гуру
Сообщения
1,011
Репутация
409
Код:
#include 'array.au3'
$vTest  = '2;"2"",2;2";3;4'
$sRet = StringRegExp($vTest, '(?<=^|;)(?:"[^"]*+"|[^;"])*+', 3)
_ArrayDisplay($sRet)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
StringRegExp - Ищет в строке совпадения с образцом, заданным в виде регулярного выражения.
То есть в результат попадают куски текста, которые подходят под шаблон. При этом, вот эти куски текста не редактируются, попадают в результат как есть.

StringRegExpReplace - Заменяет в строке куски текста, которые подходят под шаблон на что-то другое. В самой строке. Результатом является исходная строка с заменами. Не массив совпадений.

Одновременно сформировать массив результатов поиска и выполнить в них операцию замены не представляется возможным.
Нужно делать два прохода.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
#include 'array.au3'
$vTest  = '2;"2"",2;2";3;4'
$vTest = StringReplace($vTest,'"','`')
$vTest = StringReplace($vTest,'``','"')
$sRet = StringRegExp($vTest, '(?:^|;)`([^`]+)`|[^;]+', 3)
_ArrayDisplay($sRet)


Можно взять скрипт sngr и пройти по массиву, на каждом элементе сделать замены
Код:
StringReplace(...,'"','`')
StringReplace(...,'``','"')
 
Верх