Разделение смешанного списка строковых/числовых аргументов вызова функции Lua в C++/Qt

Я хочу проанализировать список аргументов вызова функции Lua в C++, используя Qt (4.8), чтобы избежать зависимости от интерпретатора Lua. Можно предположить, что список аргументов, разделенных запятыми, состоит только из строковых литералов и чисел. В конце концов результат должен быть доступен как QStringList. Сложность заключается в том, чтобы справиться с запятыми, которые являются частью строковых аргументов, а также с тем фактом, что строковые аргументы могут использовать одинарные или двойные кавычки. Пока я сам не приду к решению (используя регулярные выражения), возможно, кто-то уже имел дело с этой или похожей проблемой.

Пример:

Строка списка аргументов

"Foo", "not 'bar'", 'a, b ,c', 42, 1e-8

должен быть преобразован в строковый список, содержащий элементы

Foo, not 'bar', a, b, c, 42 и 1e-8

(опуская кавычки по пунктам, чтобы избежать путаницы)


person Christoph Freundl    schedule 10.07.2015    source источник
comment
Вы смотрели на boost::tokenizer?   -  person Jarod42    schedule 10.07.2015
comment
@Jarod42: Нет необходимости в ускорении. QString::split возвращает QStringList.   -  person user2672165    schedule 10.07.2015
comment
@ Jarod42: Я бы предпочел использовать исключительно средства, предоставляемые Qt, которых уже должно быть достаточно для решения проблемы. С другой стороны, boost::tokenizer будет рассматривать запятые внутри строковых литералов также как разделители, как это делает QString::split, верно?   -  person Christoph Freundl    schedule 10.07.2015
comment
Его дескриптор кавычки и экранирования: см. разделитель экранированного списка   -  person Jarod42    schedule 10.07.2015
comment
Да, похоже, это именно тот функционал, который мне нужен. Если я не доберусь до чистого решения Qt, я рассмотрю это.   -  person Christoph Freundl    schedule 10.07.2015


Ответы (1)


Не знаком со всеми возможностями ваших аргументов, но примеры, которые вы упомянули, правильно сопоставляются с этим: (?<=")[\w',-]*?(?=")|(?<=^'|\s').*(?='(?:,|$))|[\w-]+, как показано здесь: https://regex101.com/r/rX7fX7/3

Идея состоит в том, что вы записываете «сложные» ситуации попеременно, предпочтительно слева, а менее сложные решения — справа. Таким образом, движок сначала проверит наличие проблемной ситуации, прежде чем пытаться сопоставить целые слова.

Текущее регулярное выражение работает некорректно, если в середине аргументов появляются кавычки/двойные кавычки, но в ваших примерах таких ситуаций не было.

person Andris Leduskrasts    schedule 10.07.2015
comment
Это довольно многообещающе, но, к сожалению, у меня это не работает, так как регулярные выражения Qt 4.8 не поддерживают просмотр назад, и обновление до Qt 5 в настоящее время для меня не вариант. Я отредактировал вопрос, касающийся примера кавычек внутри строк, и добавил тег Qt 4.8. - person Christoph Freundl; 10.07.2015
comment
Что ж, вы всегда можете заменить просмотр назад группами без захвата и захватом совпадений, но для этого потребуется сопоставление результатов группы захвата с массивом. Если вам интересно такое решение, я могу его написать. - person Andris Leduskrasts; 10.07.2015