Что нового

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

liond66

Новичок
Сообщения
117
Репутация
2
1.Нужно получить в массив строку с разделителем пробел.
2.Между словами в кавычках исключить разделение (только если кавычки в начале слова и заканчивается в конце слова).
3.Если кавычки есть в середине слова, оставить как есть.

Пока нашёл вот так, но третье условие не выполняется. Кто поможет?
Код:
#include <Array.au3>
$sTest = 'строка1 "стро ка2" стро"ка3 стро"ка4'
$aRet = StringRegExp($sTest, '(?:[^" ]++|"[^"]*+")++', 3)
_ArrayDisplay($aRet)


Нужно получить:
строка1
"стро ка2"
стро"ка3
стро"ка4
 
Последнее редактирование:

sngr

AutoIT Гуру
Сообщения
1,011
Репутация
409
Код:
$sRet = StringRegExp($vTest, '(?<=^| )(?:"[^"]*+\b"|[^ ])*+', 3)
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
Спасибо.
Это работает для данного примера.
Но если убрать цифры, то уже не работает.
Код:
$sTest = 'строка "стро ка" стро"ка стро"ка'

Мне нужно с любым сочетанием и количеством слов.
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Потестируйте:
Код:
StringRegExp($sTest, '(?:\h|^)"(.+?)"(?:\h|$)|\H+', 3)

Пос #
 
Последнее редактирование:

sngr

AutoIT Гуру
Сообщения
1,011
Репутация
409
Код:
$str=StringRegExp($file, '(?<=^| )(?:"[^"]*+"|[^ ]*)*+', 3)
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
xXx
Падает на
Код:
$sTest = '"стро ка1" "стро ка2"'

sngr
Падает на
Код:
$sTest = '"a"bc def" "sdfg hj"g"'

Нужно получить:
"a"bc def"
"sdfg hj"g"

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

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Код:
$aRet = StringRegExp($sTest, '(?<=\h|^)"((?:.(?!\h"\H))+?)"(?:\h|$)|\H+', 3)
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Код:
#include <Array.au3>

Global $sTest = 'строка1 "стро ка2" стро"ка3 стро"ка4 ' & _
        'строка "стро ка" стро"ка стро"ка ' & _
        '"a"bc def" "sdfg hj"g" ' & _
        '"qwe" qe"' ;Какое поведение вы ожидаете с таким вариантом?
Global $aRet = StringRegExp($sTest, '".*?"(?= |$)|[^ ]+', 3)
_ArrayDisplay($aRet)
 
Последнее редактирование:
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
Посдедний вариант от xXx почти как нужно, но убирает кавычки.
Наверняка его можно использовать во многих случаях.

Вариант от Tempo именно то, что я хотел!
Какое поведение вы ожидаете с таким вариантом?
Правильный вопрос.
Я буду использовать это в качестве параметров при запуске скомпилированного скрипта.
По ходу будет видно, может внутренние кавычки заменю на одинарные. Или наоборот.
В любом случае это универсальное решение.
Спасибо всем!
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Последнее редактирование:
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
xXx
Для командной строки кавычки как раз нужны!
Спасибо за замечание про пробелы. Учту.

И да, Ваш ответ я тоже лайкнул! :bye:
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
А какой результат должен быть при таком раскладе?
Код:
$sTest = '"строка1 "стро ка2"'
 
Автор
L

liond66

Новичок
Сообщения
117
Репутация
2
А какой результат должен быть при таком раскладе?
Код:
$sTest = '"строка1 "стро ка2"'
Без изменений. После нахождения кавычек как первый символ слова, ищутся кавычки как последний символ слова.
В данном случае Ваш вариант не сработает.
Код от Tempo работает.
Спасибо за пример.
Сообщение автоматически объединено:

Сейчас дошёл до понимания, что кавычки для передачи параметров конечно нужны, но при парсинге они уже не нужны.
Конечно не проблема убрать в каждом элементе массива кавычки в начале и конце,
но для чистоты эксперимента: как переделать код от Tempo, чтобы убирал кавычки,
те которые в начале слова и в конце слова, но не в середине слова?
 
Последнее редактирование:

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Код:
'"(.*?)"(?: |$)|[^ ]+'
 
Последнее редактирование:
Верх