Russian Qt Forum

Qt => Общие вопросы => Тема начата: andrew.k от Декабрь 12, 2010, 20:35



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


Название: Re: Разбить строку
Отправлено: Sancho_s_rancho от Декабрь 12, 2010, 21:06
Зачем какие-то регулярные выражения, если вам достаточно в цикле разбить по 8 символов. Про одну строчку вообще не понял. Вас кто-то заставляет переходить на новую?


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


Название: Re: Разбить строку
Отправлено: Sancho_s_rancho от Декабрь 13, 2010, 07:57
Условия: цифр всегда 7. Перед цифрой идет символ. Либо "=" либо ":". Его нужно сохранить вместе с набором цифр.
Цитата: andrew.k
и потом, данные могут содержать ошибки, например, длина полей может быть некорректная (например, =111=1234567)
Цитата: andrew.k
Либо не пиши бессмысленные посты.
Так вы и не пишите бессмысленных постов, где каждый новый пост - новые условия, противоречащие  предыдущим.


Название: Re: Разбить строку
Отправлено: kirill от Декабрь 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")


Название: Re: Разбить строку
Отправлено: andrew.k от Декабрь 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


Название: Re: Разбить строку
Отправлено: kirill от Декабрь 14, 2010, 14:53
Вот! это то что, нужно. Спасибо, Кирилл. Только не очень понимаю как это работает. Конкретно второй параметр вызова replace

split напрямую использовать не получится, потому что он выкидывает разделители. Поэтому в копии (QString(str)) строки делается замена с регэкспом. Второй параметр \\1 - это то что нашел регэксп в первых скобочках (они в принципе одни в выражении). То есть перед : или = вставляется , а потом по ней идет сплит.


Название: Re: Разбить строку
Отправлено: andrew.k от Декабрь 15, 2010, 11:10
Вот! это то что, нужно. Спасибо, Кирилл. Только не очень понимаю как это работает. Конкретно второй параметр вызова replace

split напрямую использовать не получится, потому что он выкидывает разделители. Поэтому в копии (QString(str)) строки делается замена с регэкспом. Второй параметр \\1 - это то что нашел регэксп в первых скобочках (они в принципе одни в выражении). То есть перед : или = вставляется , а потом по ней идет сплит.
Это все я понял, я не понял что такое \\1 это регэксп? или команда для split
в документации написано, второй параметр это на что заменить. Если регэксп, то почему параметр идет как QString?


Название: Re: Разбить строку
Отправлено: kirill от Декабрь 15, 2010, 12:36
Это все я понял, я не понял что такое \\1 это регэксп? или команда для split
в документации написано, второй параметр это на что заменить. Если регэксп, то почему параметр идет как QString?
Я так понимаю, что строка просто подставляется в регэксп, который идет первым параметром.
В регулярных выражениях для перл это выглядело бы как
Код:
(\=|\:)\,/$1/


Название: Re: Разбить строку
Отправлено: andrew.k от Декабрь 15, 2010, 17:57
Условия: цифр всегда 7. Перед цифрой идет символ. Либо "=" либо ":". Его нужно сохранить вместе с набором цифр.
Цитата: andrew.k
и потом, данные могут содержать ошибки, например, длина полей может быть некорректная (например, =111=1234567)
Цитата: andrew.k
Либо не пиши бессмысленные посты.
Так вы и не пишите бессмысленных постов, где каждый новый пост - новые условия, противоречащие  предыдущим.
Ты бесполезный зануда. Кирилл почему-то все понял и помимо того выдал верное решение, которое мне и требовалось. А ты свою некомпетентность можешь оправдывать сколько угодно, от этого ничего не изменится.