Что нового

Проблема в патерне или в самом Autoit ?

Norm

Продвинутый
Сообщения
269
Репутация
70
Версия Autoit: 3.3.14.5

Есть простая строка с разделителем ; (*.csv) ,которую по этому разделителю нужно разделить.
Однако в строке имеется "экранированние" с помощью "". В такой группе, точнее в тексте между " и " , семиколон ; должен игнорироваться.
По этой причине пришлось отказаться от StringSplit() и попробовать раздробить строку с помощбю регулярки. Но и это оказалось не так просто.
Хотельсь бы за один проход выбрать всё, что стоит межну ; и " , даже если между ними пусто.

В указанном ниже примере, согласно Online тестеров, должно быть 10 групп на выходе.
Я проверял это ещй на других Online-Тестерах, и везде тот же результат (10 грапп), что я собственно и хочу поличить.
Однако Autoit выдает 11 групп.

Подозреваю, что это не проблема в патерне, но могу и ошибаться. Подскажите в чём я не прав.

Код:
#include <Array.au3>

Local $sString = '15;"Слово; ещё несколько слов";;123;Feuer;;Standard;Analog/AM;4;UE 1 (direkt)'
Local $aArray = StringRegExp($sString, '(?:^|;)([^;"]*)(?!")|"([^"]+)"',  3)

_ArrayDisplay($aArray, "Result")
 
Последнее редактирование:

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Режим 4 возвращает 10 групп.
Код:
#include <Array.au3>

Local $sString = '15;"Слово; ещё несколько слов";;123;Feuer;;Standard;Analog/AM;4;UE 1 (direkt)'
Local $aArray = StringRegExp($sString, '(?<=^|;)([^;"]*)(?!")|(?<=^|;)"([^"]+)"',  4)

For $i=0 To UBound($aArray) - 1
    $aArray1 = $aArray[$i]
    $aArray[$i] = $aArray1[0]
    ConsoleWrite($aArray[$i] & @CRLF)
Next

_ArrayDisplay($aArray, "Result")
 
Последнее редактирование:
  • Like
Реакции: Norm
Автор
N

Norm

Продвинутый
Сообщения
269
Репутация
70
Спасибо за наводку, Режим 4 я вообще не рассматривал.

Однако, проблема с пустой группо никуда не делась. И похоже, что это проблема самого Autoit.
Дело в том, что с флагом 4 во второй группе на выходе остаются кавычки, а их тоже не должно быть.
Такой же результат (даже немного быстрее) можно получить с флагом 3 используя этот патерн '(?:^|;)([^;"]*(?!")|"[^"]+")'

В Вашем примере, если заглянуть в подмисив второй группы, то там также присутствует лишняя группа, а UBound() = 3, когда у всех остальных 2.
Но немного доработав Ваш пример, я всётаки добился нужного мне результата.
В моём скрипте как раз, сразу после регулярки, 1D результат превращал в 2D, поэтому дополнительный цикл какраз подходит.
Код:
#include  <Array.au3>

Local $sString = '15;"Слово; ещё несколько слов";;123;Feuer;;Standard;Analog/AM;4;UE 1 (direkt)'
Local $aArray = StringRegExp($sString, '(?<=^|;)([^;"]*)(?!")|(?<=^|;")([^"]+)(?=";?)',  4)

For $i=0 To UBound($aArray) - 1
    $aArray1 = $aArray[$i]
    $aArray[$i] = $aArray1[0]
    ConsoleWrite($aArray[$i] & @CRLF)
Next
_ArrayDisplay($aArray, "Result")
 
Последнее редактирование:
Верх