Russian Qt Forum

Программирование => Общий => Тема начата: manarch от Апрель 25, 2012, 15:19



Название: Выборка параметров из списка
Отправлено: manarch от Апрель 25, 2012, 15:19
Доброго времени суток.
Помогите кто как может. В регулярных выражениях не очень

Есть строка 'DATA.VALUE, SIZE, ",", REP'
Нужно выделить из нее:
DATA.VALUE
SIZE
", "
REP

пробовал ', *' он "," делит на две кавычки удаляя ', '.
ЗЫ "," - должен иметь именно такую форму потому что это в последствии вытягивается символ-разделитель


Название: Re: Выборка параметров из списка
Отправлено: kambala от Апрель 25, 2012, 18:32
тут никакие регулярки вовсе не нужны. вот пример на Qt (для std::string пишется аналогично):
Код
C++ (Qt)
QString s("DATA.VALUE, SIZE, \",\", REP");
QStringList strings = s.split(", ");


Название: Re: Выборка параметров из списка
Отправлено: manarch от Апрель 26, 2012, 05:48
тут никакие регулярки вовсе не нужны. вот пример на Qt (для std::string пишется аналогично):
Код
C++ (Qt)
QString s("DATA.VALUE, SIZE, \",\", REP");
QStringList strings = s.split(", ");

А если строка будет вида ("DATA.VALUE,SIZE,\",\",    REP")?
Если бы все было так просто я бы не спрашивал.


Название: Re: Выборка параметров из списка
Отправлено: alexis031182 от Апрель 26, 2012, 08:03
А если строка будет вида ("DATA.VALUE,SIZE,\",\",    REP")?
Если бы все было так просто я бы не спрашивал.
kambala Вам правильно подсказывает. Предложенный им вариант будет, во-первых, быстрее работать, а, во-вторых, для написания регулярки здесь особо не к чему прицепиться - разбиение всё равно идёт по запятой.
Код:
QString s("DATA.VALUE, SIZE, \",\", REP");
QStringList strings = s.split(",", QString::SkipEmptyParts);
foreach(QString string, strings) {
   string.trimmed();
}


Название: Re: Выборка параметров из списка
Отправлено: Tonal от Апрель 26, 2012, 08:11
Разбор CSV на регулярках писать довольно грустно. Там ещё перевод строки может внутри заковыченного поля встретится.
Проще руками конечный автомат написать...
Хотя ежели неймётся, то можно и регулярками поизвращатся (вот на python-е):
Код
Python
>>> import re
>>> fld_re = re.compile(r'\s*((?:[^,"]|"[^"]*")*)\s*(?:,|$)')
>>> fld_re.findall('DATA.VALUE, SIZE, ",", "", REP')
['DATA.VALUE', 'SIZE', '","', '""', 'REP', '']
 
В приведённом выражении не учитывается перевод строки внутри поля.
Так же существует проблема последнего поля.
Чтобы её честно решить нужно усложнить выражение, описав каким образом поле может встречаться в строке.
Это увеличивает выражение ещё в 4 раза. :)


Название: Re: Выборка параметров из списка
Отправлено: kambala от Апрель 26, 2012, 12:04
тут никакие регулярки вовсе не нужны. вот пример на Qt (для std::string пишется аналогично):
Код
C++ (Qt)
QString s("DATA.VALUE, SIZE, \",\", REP");
QStringList strings = s.split(", ");

А если строка будет вида ("DATA.VALUE,SIZE,\",\",    REP")?
Если бы все было так просто я бы не спрашивал.
а может с этого и надо было начать - описать возможные входные строки?

более упрощённый вариант без учёта кавычек:
Код
C++ (Qt)
QString s("DATA.VALUE, SIZE, \",\", REP");
QStringList strings = s.split(QRegExp(",\\s*"), QString::SkipEmptyParts);


Название: Re: Выборка параметров из списка
Отправлено: manarch от Апрель 26, 2012, 12:29
тут никакие регулярки вовсе не нужны. вот пример на Qt (для std::string пишется аналогично):
Код
C++ (Qt)
QString s("DATA.VALUE, SIZE, \",\", REP");
QStringList strings = s.split(", ");

А если строка будет вида ("DATA.VALUE,SIZE,\",\",    REP")?
Если бы все было так просто я бы не спрашивал.
а может с этого и надо было начать - описать возможные входные строки?

более упрощённый вариант без учёта кавычек:
Код
C++ (Qt)
QString s("DATA.VALUE, SIZE, \",\", REP");
QStringList strings = s.split(QRegExp(",\\s*"), QString::SkipEmptyParts);

Ну вообще то я сразу описал что кавычки должны. Т.е. любое вхождение запятой внутри кавычек не должно рассматриваться как разделитель параметров.


Название: Re: Выборка параметров из списка
Отправлено: kambala от Апрель 26, 2012, 13:26
ну тогда пользуйся вариантом Tonal


Название: Re: Выборка параметров из списка
Отправлено: Igors от Апрель 26, 2012, 14:26
А если строка будет вида ("DATA.VALUE,SIZE,\",\",    REP")?
Если бы все было так просто я бы не спрашивал.
Так что у Вас кавычки (" или \") ? 
Может я чего-то не понял, но никаких сложностей не увидел. Почему не написать на простом С? Зачем нужны какие-то хитро-деланные "регулярки" которые выглядят ужасно да еще и проваливаются на простой задачке?


Название: Re: Выборка параметров из списка
Отправлено: Tonal от Апрель 27, 2012, 08:39
В приведённом выражении не учитывается перевод строки внутри поля.
Так же существует проблема последнего поля.
Ага, одшло, как всё это подхватить:
Код:
>>> import re
>>> fld_re = re.compile(r'(?:^|,)\s*((?:[^,"]|"[^"]*")*)\s*(?=,|$)')
>>> fld_re.findall('DATA.VALUE, SIZE, ",", "", "\n", REP,')
['DATA.VALUE', 'SIZE', '","', '""', '"\n"', 'REP', '']
Тут есть правда некая заковыка: я не уверен, что Qt-шный движёк регэкспов всё это правильно сожрётъ. :)
По мне так проще конечный автомат самому закодировать.


Название: Re: Выборка параметров из списка
Отправлено: Igors от Апрель 27, 2012, 11:02
По мне так проще конечный автомат самому закодировать.
Мне понятно как разобрать строку, но что то за автомат/пулемет - хз :)  Не могли бы Вы пояснить "во что это вольется" на простом С/C++ ? 


Название: Re: Выборка параметров из списка
Отправлено: kambala от Апрель 27, 2012, 12:15
Тут есть правда некая заковыка: я не уверен, что Qt-шный движёк регэкспов всё это правильно сожрётъ. :)
просмотр вперёд в Qt поддерживается, так что всё должно быть ок