Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Из строки выбрать только цифры с regexp 
V
    Опции темы
apv1989
Дата 14.7.2011, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 22.5.2008

Репутация: нет
Всего: нет



Здравствуйте, уважаемые.

Кто имеет большой опыт в регулярках, помогите, пожалуйста.

Нужно из строки с номером телефона, хранящемся в произвольном формате, выбрать только цифры, причем, если номер начинается с 846, то эти цифры не нужны (это не обязательное условие, без него тоже хорошо).

Пример: 
8-927-0-123-456    -> 9270123456
8(960)123-45-67    -> 9601234567
79170123456         -> 9170123456
+7-915-123-456-7  -> 9151234567
8-846-123-456-7    -> 1234567
123-456-7              -> 1234567
8101-555-55-55     -> 1015555555
и т.д.

Спасибо.
PM MAIL   Вверх
borisbn
Дата 14.7.2011, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Если уж очень хочется RegExp'ом, то можно не "вытаскивать" цифры, а "выкинуть" всё остальное
Код

    QStringList tels = QStringList() << "8-927-0-123-456"/*    -> 9270123456*/
        << "8(960)123-45-67"/*    -> 9601234567*/
        << "79170123456"/*         -> 9170123456*/
        << "+7-915-123-456-7"/*  -> 9151234567*/
        << "8-846-123-456-7"/*    -> 1234567*/
        << "123-456-7"/*              -> 1234567*/
        << "8101-555-55-55"/*     -> 1015555555    */
        << "8101-555-8846"/*     -> 1015558846    */
    ;
    foreach ( QString tel, tels )
    {
        tel.remove( QRegExp( "[\\+\\-\\(\\)]" ) );
        tel.remove( QRegExp( "^[78]{1,1}" ) );
        tel.remove( QRegExp( "^846{1,1}" ) );
        qDebug() << tel;
    }


Это сообщение отредактировал(а) borisbn - 14.7.2011, 13:21


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
o6s
Дата 14.7.2011, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 28.8.2008

Репутация: нет
Всего: нет



только Regexp можно проще 
Код

#include <QtCore/QCoreApplication>
#include <QStringList>
#include <QRegExp>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QStringList tels;
    tels << "8-927-0-123-456"/*    -> 9270123456*/
         << "8(960)123-45-67"/*    -> 9601234567*/
         << "79170123456"/*         -> 9170123456*/
         << "+7-915-123-456-7"/*  -> 9151234567*/
         << "8-846-123-456-7"/*    -> 1234567*/
         << "123-456-7"/*              -> 1234567*/
         << "8101-555-55-55"/*     -> 1015555555    */
         << "8101-555-8846"/*     -> 1015558846    */
            ;
    for (int i=0;i<tels.size();i++) {
        tels[i] = tels[i].remove(QRegExp("\\D"));
    }
    qDebug() << tels;


    return a.exec();
}

PM MAIL   Вверх
apv1989
Дата 15.7.2011, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 22.5.2008

Репутация: нет
Всего: нет



borisbn
Спасибо, точно так как я и делаю. Только первый регексп беру \D, а другие два вместе сляпываю.
Код

tel.remove( QRegExp( "^[78]{1,1}" ) );
tel.remove( QRegExp( "^846{1,1}" ) );

{1,1} - избыточная запись. Можно просто {1}

o6s
Спасибо за отклик. Я делаю так же.
Оставляют регекспом \D только цифры и вторым регэкспом выкидываю все остальное, 
Код

tel.remove(QRegExp("^([78](846)?){1}"));

но потом эта строка не хочет делать .toInt()  .toUlong() и т.д. , хотя я реально вижу, что там только цифры.


Спросил, потому что думал, может кто-нибудь подскажет так, чтобы тоже самое делалось одним регекспом)

Это сообщение отредактировал(а) apv1989 - 15.7.2011, 18:55
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0426 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.