Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Из строки выбрать только цифры с regexp


Автор: apv1989 14.7.2011, 10:53
Здравствуйте, уважаемые.

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

Нужно из строки с номером телефона, хранящемся в произвольном формате, выбрать только цифры, причем, если номер начинается с 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
и т.д.

Спасибо.

Автор: borisbn 14.7.2011, 13:19
Если уж очень хочется 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;
    }

Автор: o6s 14.7.2011, 21:41
только 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();
}

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

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

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

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

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

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


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)