Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QString и QRegExp
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
Rosster
Следующая проблема:
Есть QString str = "1234567890123 01.02.03г. По Красногвардейскому р-ну г.Санкт-Петербург";
мне нужно выдрать 3 группы слов:
1)1234567890123 - оно может иметь <=13 цифр
2)01.02.03 - год может иметь и 4 цифры
3)остальная часть после даты.
Пытаюсь реализовать это с помощью QRegExp и QString::split() и QString::section(). Никак не могу отловить правильную комбинацию.
Странно что в QString есть contains(), но нету выборки из текста заданных QRegExp выражением.
Буду благодарен за содействие в решении проблемы)
silver47
Если позиции элементов всегда одинаковы, то логично же, читать первый блок до первого пробела.. читать второй блок до второго и все остальное.
Rosster
Цитата(silver47 @ 1.9.2011, 10:35) *
Если позиции элементов всегда одинаковы, то логично же, читать первый блок до первого пробела.. читать второй блок до второго и все остальное.

Эти три группы могут быть в разном порядке, в этом вся и сложность.
Просто надо как-то написать выборку 13 цифр и меньше, даты, и остальное что есть в строке
RazrFalcon
Худший, наверное, способ:
  //QString str = "1234567890123 01.02.03г. По Красногвардейскому р-ну г.Санкт-Петербург";
  QString str = "По Красногвардейскому р-ну г.Санкт-Петербург 1234567890123 01.02.03г.";
  //QString str = "01.02.03г. По Красногвардейскому р-ну г.Санкт-Петербург 1234567890123";

  QRegExp numReg("[0-9]{3,13}");
  QRegExp yearReg("[0-9][0-9]\\.[0-9][0-9]\\.[0-9][0-9].\\.");

  //qDebug()<<str.remove(numReg);

  QString address = str;
  address.remove(numReg);
  address.remove(yearReg);
  qDebug()<<address.remove(QRegExp("^[ ]*|[ ]$")); //удаляем лишние пробелы

  QString year = str;
  year.remove(address);
  year.remove(numReg);
  year.remove(QRegExp("[ ]*")); //удаляем лишние пробелы
  qDebug()<<year;

  QString nums = str;
  nums.remove(address);
  nums.remove(year);
  nums.remove(QRegExp("[ ]*")); //удаляем лишние пробелы
  qDebug()<<nums;

Вывод:
"По Красногвардейскому р-ну г.Санкт-Петербург" 
"01.02.03г."
"1234567890123"


UPD: поправил выражения.
Rosster
Нашел способ, но тоже не идеальный, если учитывать, что расположение 3 групп разное.
Если оно статичное, то считаю лучшее решение (может кому пригодится):

QString str = "1234567890123 01.02.03г. По Красногвардейскому р-ну г.Санкт-Петербург";
QRegExp exp("([0-9]{6,13})(?:\.*)([0-9]{2}\\.[0-9]{2}\\.[0-9]{2,4})");
int pos = exp.indexIn(ogrn);
if(pos != -1
{
        qDebug() << exp.cap(1); //1234567890123
        qDebug() << exp.cap(2); //01.02.03
}
QString address = str.remove(exp);
if(address.left(2) == "г.")
        address.remove(0, 2); //По Красногвардейскому р-ну г.Санкт-Петербург

Если допустим будет строка "01.02.03г. По Красногвардейскому р-ну г.Санкт-Петербург 1234567890123"
то нужно просто поменять местами в регулярном выражении на "([0-9]{2}\\.[0-9]{2}\\.[0-9]{2,4})(?:\.*)([0-9]{6,13})"

Все)
Тему можно закрывать, решение найдено, спасибо всем.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2019 IPS, Inc.