Russian Qt Forum
Сентябрь 30, 2024, 14:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Выборка параметров из списка  (Прочитано 8594 раз)
manarch
Гость
« : Апрель 25, 2012, 15:19 »

Доброго времени суток.
Помогите кто как может. В регулярных выражениях не очень

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

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

Сообщений: 4744



Просмотр профиля WWW
« Ответ #1 : Апрель 25, 2012, 18:32 »

тут никакие регулярки вовсе не нужны. вот пример на Qt (для std::string пишется аналогично):
Код
C++ (Qt)
QString s("DATA.VALUE, SIZE, \",\", REP");
QStringList strings = s.split(", ");
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
manarch
Гость
« Ответ #2 : Апрель 26, 2012, 05:48 »

тут никакие регулярки вовсе не нужны. вот пример на Qt (для std::string пишется аналогично):
Код
C++ (Qt)
QString s("DATA.VALUE, SIZE, \",\", REP");
QStringList strings = s.split(", ");

А если строка будет вида ("DATA.VALUE,SIZE,\",\",    REP")?
Если бы все было так просто я бы не спрашивал.
Записан
alexis031182
Гость
« Ответ #3 : Апрель 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();
}
Записан
Tonal
Гость
« Ответ #4 : Апрель 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 раза. Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #5 : Апрель 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);
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
manarch
Гость
« Ответ #6 : Апрель 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);

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

Сообщений: 4744



Просмотр профиля WWW
« Ответ #7 : Апрель 26, 2012, 13:26 »

ну тогда пользуйся вариантом Tonal
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Апрель 26, 2012, 14:26 »

А если строка будет вида ("DATA.VALUE,SIZE,\",\",    REP")?
Если бы все было так просто я бы не спрашивал.
Так что у Вас кавычки (" или \") ? 
Может я чего-то не понял, но никаких сложностей не увидел. Почему не написать на простом С? Зачем нужны какие-то хитро-деланные "регулярки" которые выглядят ужасно да еще и проваливаются на простой задачке?
Записан
Tonal
Гость
« Ответ #9 : Апрель 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-шный движёк регэкспов всё это правильно сожрётъ. Улыбающийся
По мне так проще конечный автомат самому закодировать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Апрель 27, 2012, 11:02 »

По мне так проще конечный автомат самому закодировать.
Мне понятно как разобрать строку, но что то за автомат/пулемет - хз Улыбающийся  Не могли бы Вы пояснить "во что это вольется" на простом С/C++ ? 
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #11 : Апрель 27, 2012, 12:15 »

Тут есть правда некая заковыка: я не уверен, что Qt-шный движёк регэкспов всё это правильно сожрётъ. Улыбающийся
просмотр вперёд в Qt поддерживается, так что всё должно быть ок
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.298 секунд. Запросов: 23.