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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Распарсить строку INI-файла  (Прочитано 9622 раз)
titan83
Гость
« : Январь 18, 2016, 17:29 »

Коллеги. Полдня парюсь - не могу сделать Regexp для того, чтобы парснуть такую строку:
Name = Value ; some comment
В результате хочу иметь QVariantList, где имя -> Name, а значение -> Value. Коммент должен игнорироваться.
Сейчас использую такую строку:
^\s*([^(\s*\=\s*)]+)\s*\=\s*([\d\D]*)
Строку без комментария в конце она парсит правильно, а вот дальше добавить отсечение того, что после ';' - не получается.
Буду очень признателен, если кто-то подскажет.
Спасибо.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Январь 18, 2016, 17:43 »

^(\w+) *= *(\w+) *; *.*$

Ссылка на тестер: https://regex101.com/r/rU0jK4/1
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Январь 19, 2016, 10:25 »

Ах как активно, рьяно это заучивается  Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Январь 19, 2016, 14:26 »

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

Изучением 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


Просмотр профиля
« Ответ #4 : Январь 19, 2016, 14:41 »

в данном случае без регулярок будет сделать проще, понятнее и быстрее
Хотел сказать то же самое - но уже боюсь трогать "священную корову" (затравили  Улыбающийся)
Записан
titan83
Гость
« Ответ #5 : Январь 26, 2016, 13:20 »

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

мой результат такой:
^\s*(;?)\s*(\S+)\s*=\s*\"?([^;"]+[()\w+\s*]+)\"?\s*;?
Этот рекэкс парсит и комментарий с начала строки ("; Test1 = Value1"),
игнорирует комментарии в той же строке после имени-значения ("Test1 = Value1 ; comment") при этот комментарий может как присутствовать, так и отсутствовать.
Также значение можно писать, как в кавычках ("Value1"), так и без кавычек (Value1).
Комментарий в конце строки игнорируется.
Т.е. в итоге получаю три группы:
1. Символ ';' или '', если символ есть, значит вся строка комментарий.
2. Название параметра.
3. Значение параметра.

На мой взгляд получилось более чем достойно.

в данном случае без регулярок будет сделать проще, понятнее и быстрее
Не согласен: регулярки - суть готовый автомат состояний, да они сложны для понимания, особенно по началу, но результат того стоит.

Всем еще раз спасибо за участие.
« Последнее редактирование: Январь 26, 2016, 13:27 от titan83 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Январь 26, 2016, 14:21 »

Также значение можно писать, как в кавычках ("Value1"), так и без кавычек (Value1).
На этом я неск раз залетал - возможны "кривые" кавычки, смотрятся почти также но символ другой

мой результат такой:
^\s*(;?)\s*(\S+)\s*=\s*\"?([^;"]+[()\w+\s*]+)\"?\s*;?
...
На мой взгляд получилось более чем достойно.
Ой  Улыбающийся
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Январь 26, 2016, 14:24 »

А не проще использовать не свой формат, а стандартный? Тот же xml или json
Записан

kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Январь 26, 2016, 15:49 »

в данном случае без регулярок будет сделать проще, понятнее и быстрее
Не согласен: регулярки - суть готовый автомат состояний, да они сложны для понимания, особенно по началу, но результат того стоит.
я их знаю достаточно неплохо, но по-моему очевидно, что в данном случае они вообще не к месту, т.к. только усложняют читабельность (ты вон аж сколько комментариев написал к своей регулярке). изучить новую технологию и совать ее во все подряд — это неправильный подход.

вот скажи: сколько ты потратил времени на то, чтобы составить свою регулярку? а сколько бы ты потратил времени на следующий код, делающий то же самое?
Код
C++ (Qt)
QString input;
QString nameValue = input.split(";").at(0).trimmed();
if (!nameValue.isEmpty())
{
   QStringList nameValueList = nameValue.split(" = ");
   QString name = nameValueList.at(0), value = nameValueList.at(1);
}
Записан

Изучением 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


Просмотр профиля
« Ответ #9 : Январь 26, 2016, 16:49 »

вот скажи: сколько ты потратил времени на то, чтобы составить свою регулярку? а сколько бы ты потратил времени на следующий код, делающий то же самое?
Код
C++ (Qt)
QString input;
QString nameValue = input.split(";").at(0).trimmed();
if (!nameValue.isEmpty())
{
   QStringList nameValueList = nameValue.split(" = ");
   QString name = nameValueList.at(0), value = nameValueList.at(1);
}
Ну тут можно предъявить немало претензий

1) строка может быть и пустой (летим на первой строчке)
2) а если nameValue.isEmpty() вернет true (не ошибка, но нужен еще код)
3) никто не обещал что будут пробелы до и после "="
4) знака равенства может вообще не быть (летим на последней строке)
5) возможны доп пробелы, напр "  = "  (нужен еще trimmed)
6) все-таки копирование интенсивное (хотя в UI это терпимо)

Думается такие "противные мелочи" (постоянно вылазят, доделывать) и побуждают молодых людей юзать "регулярки". А дальше срабатывает инерция: "я же не даром учил!"

...изучить новую технологию...
Совершенно верно, "технология" - и НИКАКОГО отношения к программированию она не имеет. Может знание этой технологии и добавит программисту "очков" (напр при приеме на работу) - но может и нет.

А ведь аккуратный разбор (без всяких регулярок) - отличная тренировка логического мЫшления. Напр что если в стиле wxWidgets (в одном проекте с ним работал и тамошний строчник сподобався)
Код
C++ (Qt)
void ParseIniLine( const QString & txt, QStringRef result[2] )
{
QStringRef src = BeforeFirst(txt, ';').trimmed();
result[0] = BeforeFirst(src, '=').trimmed();
result[1] = AfterFirst(src, '=').trimmed();
}
 
Вроде ни одного malloc Улыбающийся  Да, придется написать пару однострочных inline, но они всегда нужны.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #10 : Январь 26, 2016, 17:03 »

0) суть же была не в том, чтобы в мельчайших подробностях написать код Улыбающийся
1) как мы полетим, если после сплита получится список из одного элемента — пустой строки?
2) само собой, но я не знаю как автор такое обрабатывает
3) автор нам обещает. Тут (как и в случае с ; ) можно разбить по \s*=\s*
4) опять же автор нам обещает. но тут мы и правда полетим при доступе к элементу с индексом 1
5) см. 0
Записан

Изучением 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


Просмотр профиля
« Ответ #11 : Январь 26, 2016, 17:12 »

3) автор нам обещает. ..
4) опять же автор нам обещает ..
Не надо быть таким доверчивым Улыбающийся А вообще Ваш новый ход мысли мне нравится (раньше тоже были регулярки на любой чих)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Январь 26, 2016, 17:13 »

А ведь аккуратный разбор (без всяких регулярок)
...
Вроде ни одного malloc Улыбающийся 
Ну я бы не назвал это аккуратным разбором.
malloc там может быть и нет, но строка разбирается в 3 (три) прохода, хотя легко разбирается и в один.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #13 : Январь 26, 2016, 17:46 »

А вообще Ваш новый ход мысли мне нравится (раньше тоже были регулярки на любой чих)
если регулярное выражение несложное для написания и понимания, лучше использовать его. здесь как раз не такой случай.
Записан

Изучением 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
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #14 : Январь 26, 2016, 18:43 »

Подолью масла в огонь:
Код:
boost::property_tree::ini_parser::read_ini
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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