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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Разбить строку  (Прочитано 14570 раз)
andrew.k
Гость
« : Декабрь 12, 2010, 20:35 »

Подскажите как проще всего разбить строку вида "=1234567:1111111=2222222=3333333"
На четыре строки =1234567, :1111111, =2222222, =3333333.
Пробую через split( QRegExp() );
Но то никак не могу составить правильный регэксп.
Условия: цифр всегда 7. Перед цифрой идет символ. Либо "=" либо ":". Его нужно сохранить вместе с набором цифр.
Самое простое решение разбить строку по 8 символов. Но как это сделать одной строчкой? Улыбающийся
QRegExp( "c{8}" ) не срабатывает.
Записан
Sancho_s_rancho
Гость
« Ответ #1 : Декабрь 12, 2010, 21:06 »

Зачем какие-то регулярные выражения, если вам достаточно в цикле разбить по 8 символов. Про одну строчку вообще не понял. Вас кто-то заставляет переходить на новую?
Записан
andrew.k
Гость
« Ответ #2 : Декабрь 12, 2010, 23:01 »

я про одну строчку кода.
Регулярные выражения за тем, что это удобно.
и потом, данные могут содержать ошибки, например, длина полей может быть некорректная (например, =111=1234567)
например, будет не хватать одной или не одной цифры. Так что тупо разбивать по 8 символов нельзя. Понятно почему.
Сейчас сделал так.
split( QRegExp( "[=:]", QString::SkipEmptyParts ) получаю список ("=", "=")
split( QRegExp( "\\d", QString::SkipEmptyParts ) получаю список ( "111", "1234567" )
В обоих списках элементы расположены соответственно друг другу.
Это две строчки.
Предложи свой лучший алгоритм. Либо не пиши бессмысленные посты.
« Последнее редактирование: Декабрь 12, 2010, 23:12 от andrew.k » Записан
Sancho_s_rancho
Гость
« Ответ #3 : Декабрь 13, 2010, 07:57 »

Условия: цифр всегда 7. Перед цифрой идет символ. Либо "=" либо ":". Его нужно сохранить вместе с набором цифр.
Цитата: andrew.k
и потом, данные могут содержать ошибки, например, длина полей может быть некорректная (например, =111=1234567)
Цитата: andrew.k
Либо не пиши бессмысленные посты.
Так вы и не пишите бессмысленных постов, где каждый новый пост - новые условия, противоречащие  предыдущим.
« Последнее редактирование: Декабрь 13, 2010, 07:59 от Sancho_s_rancho » Записан
kirill
Гость
« Ответ #4 : Декабрь 14, 2010, 08:23 »

Код
C++ (Qt)
  QString str = "=1234567:1111111=2222222=3333333";
  QStringList lst = QString(str).replace(QRegExp("(\\=|\\:)"), ",\\1")
                                .split(",", QString::SkipEmptyParts);
  qDebug() << lst;
 
 
Output:
("=1234567", ":1111111", "=2222222", "=3333333")
Записан
andrew.k
Гость
« Ответ #5 : Декабрь 14, 2010, 12:32 »

Код
C++ (Qt)
  QString str = "=1234567:1111111=2222222=3333333";
  QStringList lst = QString(str).replace(QRegExp("(\\=|\\:)"), ",\\1")
                                .split(",", QString::SkipEmptyParts);
  qDebug() << lst;
 
 
Output:
("=1234567", ":1111111", "=2222222", "=3333333")
Вот! это то что, нужно. Спасибо, Кирилл. Только не очень понимаю как это работает. Конкретно второй параметр вызова replace
Записан
kirill
Гость
« Ответ #6 : Декабрь 14, 2010, 14:53 »

Вот! это то что, нужно. Спасибо, Кирилл. Только не очень понимаю как это работает. Конкретно второй параметр вызова replace

split напрямую использовать не получится, потому что он выкидывает разделители. Поэтому в копии (QString(str)) строки делается замена с регэкспом. Второй параметр \\1 - это то что нашел регэксп в первых скобочках (они в принципе одни в выражении). То есть перед : или = вставляется , а потом по ней идет сплит.
Записан
andrew.k
Гость
« Ответ #7 : Декабрь 15, 2010, 11:10 »

Вот! это то что, нужно. Спасибо, Кирилл. Только не очень понимаю как это работает. Конкретно второй параметр вызова replace

split напрямую использовать не получится, потому что он выкидывает разделители. Поэтому в копии (QString(str)) строки делается замена с регэкспом. Второй параметр \\1 - это то что нашел регэксп в первых скобочках (они в принципе одни в выражении). То есть перед : или = вставляется , а потом по ней идет сплит.
Это все я понял, я не понял что такое \\1 это регэксп? или команда для split
в документации написано, второй параметр это на что заменить. Если регэксп, то почему параметр идет как QString?
Записан
kirill
Гость
« Ответ #8 : Декабрь 15, 2010, 12:36 »

Это все я понял, я не понял что такое \\1 это регэксп? или команда для split
в документации написано, второй параметр это на что заменить. Если регэксп, то почему параметр идет как QString?
Я так понимаю, что строка просто подставляется в регэксп, который идет первым параметром.
В регулярных выражениях для перл это выглядело бы как
Код:
(\=|\:)\,/$1/
Записан
andrew.k
Гость
« Ответ #9 : Декабрь 15, 2010, 17:57 »

Условия: цифр всегда 7. Перед цифрой идет символ. Либо "=" либо ":". Его нужно сохранить вместе с набором цифр.
Цитата: andrew.k
и потом, данные могут содержать ошибки, например, длина полей может быть некорректная (например, =111=1234567)
Цитата: andrew.k
Либо не пиши бессмысленные посты.
Так вы и не пишите бессмысленных постов, где каждый новый пост - новые условия, противоречащие  предыдущим.
Ты бесполезный зануда. Кирилл почему-то все понял и помимо того выдал верное решение, которое мне и требовалось. А ты свою некомпетентность можешь оправдывать сколько угодно, от этого ничего не изменится.
« Последнее редактирование: Декабрь 15, 2010, 18:07 от andrew.k » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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