Форум программистов, компьютерный форум CyberForum.ru

Вытянуть номер телефона - C++

Восстановить пароль Регистрация
 
RampageTechn
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 6
11.03.2013, 02:41     Вытянуть номер телефона #1
Здравствуйте.
У меня есть некоторый текст:
Код
Привет, меня зовут Саша.
Мой номер телефона 050-123-45-67.
Подскажите пожалуйста как можно сначала отсюда вытянуть сам номер телефона : 050-123-45-67
А потом убрать из него тире(чтоб был вот в таком формате) : 0501234567
У меня таких объявлений много надо сделать все в цикле и записывать результат (0501234567) например в массив.
Думаю можно через regexp. Но с ним не очень знаком.
Спасибо за помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2013, 02:41     Вытянуть номер телефона
Посмотрите здесь:

найти номер телефона человека с заданной фамилией C++
Структура и объединение: дан список студентов. Общие поля: Ф.И.О., группа, домашний номер телефона. Для тех, у кого домашний телефон указать его номер C++
C++ Написать программу,которая запрашивает у пользователя фамилию,дату рождения,номер группы,номер телефона и записывает их в данные
C++ Вывод на консоль информации о человеке, номер телефона которого введён с консоли
C++ Получить из строки отдельно фамилию, имя, отчество, возраст и номер телефона
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GoldenId
 Аватар для GoldenId
45 / 43 / 2
Регистрация: 11.11.2010
Сообщений: 272
Завершенные тесты: 1
11.03.2013, 04:24     Вытянуть номер телефона #2
Вот вариант с использованием stl
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <string>
#include <iostream>
#include <regex>
 
using namespace std;
 
int main()
{
    setlocale( LC_ALL, "Russian" );
 
    string inText = "Привет, меня зовут Саша.\n"\
        "Мой номер телефона 050-123-45-67.";
 
    cout << "Входной текст: " << endl << inText << endl;
    regex regex1( "\\d{3}-\\d{3}-\\d{2}-\\d{2}" );
    regex regex2( "-" );
    string empty( "" );
    smatch matches1;
    if( regex_search( inText, matches1, regex1 ) )
        cout << "Извлеченный номер: " <<
            regex_replace( matches1[0].str(), regex2, empty );
    else
        cout << "Совпадений не было найдено";
    cin.get();
}
Написано с Божией и вот и вот помощью.

Добавлено через 6 минут
Вот здесь сказано
std::regex is not supported yet by many compilers (gcc for example). This may cause many problems when you would like to compile your code on computers with different environments than yours. Here you can find C++11 support table This is why I would suggest to you to get familiar with boost::regex.
то есть, std::regex уже отжил, используйте boost::regex, ребятки.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
11.03.2013, 05:35     Вытянуть номер телефона #3
Цитата Сообщение от GoldenId Посмотреть сообщение
то есть, std::regex уже отжил, используйте boost::regex, ребятки.
Boost тем более не входит в стандарт, так что используйте старый-добрый strtok
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2013, 09:32     Вытянуть номер телефона #4
Задача решается просто, если текст именно такого формата. Всё именно от этого зависит. Даже если есть много таких же записей. Описание формата записи: две строки (или несколько), последнее слово во второй (или в последней) номер телефона. Решение: чтение текста по словам в string (например из строкового потока через cin >>), последнее слово сохраняется (это номер телефона). Дальше (убрать тире) элементарно.
RampageTechn
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 6
12.03.2013, 16:09  [ТС]     Вытянуть номер телефона #5
Спасибо большое.
GoldenId
 Аватар для GoldenId
45 / 43 / 2
Регистрация: 11.11.2010
Сообщений: 272
Завершенные тесты: 1
13.03.2013, 20:57     Вытянуть номер телефона #6
Ну в том то и дело, alsav22. Скажите, сколько раз за последнюю неделю заказчик Вам говорил: "Ой, а я хочу здесь еще вот такую штучку", и Вам приходилось лопатить тонны кода и перестраивать всю структуру?

О том и речь, что если номер вдальнейшем уедет в середину текста, у него изменится длина или он попылвёт каким-то другим образом, то регулярные выражения будет приспособить гораздо легче, чем поиск по жестко закодированным параметрам.

Другое дело, что если это студенческая программа на защиту лабораторной, то конечно подключать регулярные выражения смысла нет.

xtorne21st, в своё время так и не справился с установкой boost.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.03.2013, 18:06     Вытянуть номер телефона #7
Нет универсалного кода. Каждый - под какие-то условия. Сложноватое решение я предложил в 4 посте. Можно просто схранить последние 14 символов строки и удалить тире и последнюю точку. Но это к слову...
Если без регулярных выражений, то можно как-то так:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <iostream>
#include <string>
#include <cctype>
#include <cstdlib>
using namespace std;
 
// если между индексами только цифры, то вернёт true
inline bool f(const string &str, int first, int last)
{
    for (int i = first; i < last; i++)
        if (!isdigit((unsigned char)str[i])) return false;
    
    return true;
}
 
// проверка номера на правильность
bool fnamberpar(string &namber)
{
    // 050-123-45-67
    
    int i1 = 3; int i2 = 7; int i3 = 10; // индексы '-'
    const int N = 13; // количество символов
    
    // количество символов, нидексы '-'
    if (namber.size() != N   ||
        namber[i1]    != '-' ||
        namber[i2]    != '-' ||
        namber[i3]    != '-'   ) return false;
 
    // если до тире и после тире только цифры
    if (f(namber,  0,       i1) &&
        f(namber, (i1 + 1), i2) &&
        f(namber, (i2 + 1), i3) &&
        f(namber, (i3 + 1),  N))   
        {
            // удаляем '-'
            namber.erase(i1    , 1);
            namber.erase(i2 - 1, 1);
            namber.erase(i3 - 2, 1);
            
            return true;
        }
    
    else return false;       
 }
 
int main()
{
    // В тексте номер из 13 символов: три цифры, тире
    // три цифры, тире, две цифры, тире, две цифры. Перед номером
    // (если не в начале текста) пробел. После номера - или пробел, или точка.
    
    setlocale(0, "");
    
    string str = "Привет, меня зовут Саша.\n"
    "Мой номер  телефона 050-123-45-67.";
    
    string namber;
    int i, j;
    
    // ищем цифру, если не первая, то перед цифрой должен быть пробел
    for (i = 0; i < str.size(); ++i)
    {
        if ((isdigit((unsigned char)str[0])) ||
           (isdigit((unsigned char)str[i]) && str[i - 1] == ' '))
        {
            // если цифра найдена, то эту цифру и цифры, и тире после неё
            // добавляем в строку номера 
            for (j = i; j < str.size(); j++)
            {
               if (isdigit((unsigned char)str[j]) || str[j] == '-') namber.push_back(str[j]);
               else break; // если встретилась не цифра и не тире
            }
            // если символ не последний в строке, 
            // и после него нет пробела или точки, то продолжаем поиск
            if ((j < str.size()) &&  (str[j] != ' ') && (str[j] != '.'))
            {
                i = j;
                continue;
            }
            // если есть, то проверем номер на правильность
            if (fnamberpar(namber))
            {
                cout << "Номер найден: " << namber << endl;
                break;
            }
            
        }
    }
    
    // если цифра, перед которой пробел (если не первая), не найдена, 
    // или номер не прошёл проверку на правильность
    if (i == str.size()) cout << "Номер не найден" << endl;
    
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2013, 18:09     Вытянуть номер телефона
Еще ссылки по теме:

Записать в файл номер телефона и сумму разговоров C++
Найти ищет по имени и адресу номер телефона. Ссылка на неразрешенный внешний символ C++
Структура «Школьник»: фамилия, имя, отчество; класс; номер телефона; оценки по предметам C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ev[G]eN
Эксперт С++
 Аватар для Ev[G]eN
5093 / 1531 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
14.03.2013, 18:09     Вытянуть номер телефона #8
вот как вариант, но действует он если больше не введено никаких цифр. сугубо номер телефона:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <vector>
 
int main ()
{
    std::string string = "Hello, my name is Sasha.\n"\
                         "My telephone number is 050-123-45-67.";
    std::copy(string.begin(), string.end(), std::ostream_iterator <char> (std::cout));
    
    std::vector <int> vector;
    for (unsigned i = 0; i < string.length(); i++)
        if (isdigit(string.at(i)))
            vector.push_back(string.at(i) - '0');
    std::cout << std::endl << "Your number: ";
    std::copy(vector.begin(), vector.end(), std::ostream_iterator <int> (std::cout));
 
    return 0;
}
Yandex
Объявления
14.03.2013, 18:09     Вытянуть номер телефона
Ответ Создать тему
Опции темы

Текущее время: 12:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru