Re[2]: std::regex парсинг номера телефона
От: Мёртвый Даун Россия  
Дата: 11.12.17 04:04
Оценка: 12 (1) :))
Здравствуйте, rg45, Вы писали:

R>Жаль, что ты не дал словесного описания задачи, ведь из нерабочего регекса можно понять неправильно. Если я только правильно понял условие, то решение может быть таким:


Супер! Прям то что надо! Спасибо огромное!

Задачу в проекте закрыл, твой копирайт приписал, уехало в продакшен.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re: std::regex парсинг номера телефона
От: rg45 СССР  
Дата: 09.12.17 23:47
Оценка: 9 (1) +2
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Всем привет!

МД>С регуляркой дружу поскольку постольку. Есть вопрос, достать номер телефона. Но проблема скорее всего с незнанием std::regex.

Жаль, что ты не дал словесного описания задачи, ведь из нерабочего регекса можно понять неправильно. Если я только правильно понял условие, то решение может быть таким:

https://ideone.com/69RjO3

#include <iostream>
#include <regex>
     
std::string exptract_phone_number(const std::string& input)
{
  const std::regex pattern(R"(^(8|\+?420)\s*\-?\s*(?:(\d{3})|\((\d{3})\))\s*\-?\s*(\d{7})$)");
  std::smatch match;
  return std::regex_match(input, match, pattern) ?
    match[2].str() + match[3].str() + match[4].str() : "";
}
    
int main()
{
  std::cout << exptract_phone_number("4207743822140") << std::endl;
  std::cout << exptract_phone_number("+420-7743822140") << std::endl;
  std::cout << exptract_phone_number("+420-(774)3822140") << std::endl;
  std::cout << exptract_phone_number("+420774-3822140") << std::endl;
  std::cout << exptract_phone_number("+420(774)-3822140") << std::endl;
  std::cout << exptract_phone_number("+420-774-3822140") << std::endl;
  std::cout << exptract_phone_number("+420-(774)-3822140") << std::endl;
     
  std::cout << exptract_phone_number("87743822140") << std::endl;
  std::cout << exptract_phone_number("8-7743822140") << std::endl;
  std::cout << exptract_phone_number("8-(774)3822140") << std::endl;
  std::cout << exptract_phone_number("8774-3822140") << std::endl;
  std::cout << exptract_phone_number("8(774)-3822140") << std::endl;
  std::cout << exptract_phone_number("8-774-3822140") << std::endl;
  std::cout << exptract_phone_number("8-(774)-3822140") << std::endl;
}
--
Отредактировано 09.12.2017 23:47 rg45 . Предыдущая версия .
std::regex парсинг номера телефона
От: Мёртвый Даун Россия  
Дата: 06.12.17 05:12
Оценка:
Всем привет!

С регуляркой дружу поскольку постольку. Есть вопрос, достать номер телефона. Но проблема скорее всего с незнанием std::regex.

// телефон
std::string pattern(R"(^((8|\\+420)[\\- ]?)?(\\(?\\d{3}\\)?[\\- ]?)?[\\d\\- ]{7,10}$)");

std::string data("4207743822140");
std::smatch match;

try
{
    if (std::regex_match(data, match, pattern))
    {
        // вот тут в match имеем 5 совпадений
        // и например, match[3] выглядит вот так в дебагере:
        // match[3].matched = true
        // match[3].first = "420" // это итератор?
        // match[3].second = "7743822140" // это итератор?

        const std::string s1 = ...; // вот сюда хочу именно вот это "7743822140",
                                    // как достать?
    }
}
catch (const std::regex_error& e)
{
    // smth. wrong
}
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re: std::regex парсинг номера телефона
От: SaZ  
Дата: 06.12.17 07:43
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Всем привет!

МД>С регуляркой дружу поскольку постольку. Есть вопрос, достать номер телефона. Но проблема скорее всего с незнанием std::regex.

Когда-то очень давно решал такую задачу, когда делал плагин для фаерфокса с подсветкой телефонных номеров. Главный вопрос при проектировании был — а что считать номером телефона?
Но в моём случае пришлось отказаться от регулярок в пользу ручного парсинга, ибо когда было много телефонов и много вкладок, ff начинал сильно педалить.
Re: std::regex парсинг номера телефона
От: Alexander G Украина  
Дата: 06.12.17 09:36
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД> // match[3].first = "420" // это итератор?

МД> // match[3].second = "7743822140" // это итератор?

Это, похоже, итераторы на вот эту группу (8|\\+420) , первый на начало строки, второй на конец группы
Достать как-то так,
const std::string s1 = (match[3].first, match[3].second);
но, видимо, нужна не группа 3, а группа 0 — всё выражение, или 1 — всё, что в корневых скобках.
Русский военный корабль идёт ко дну!
Re[2]: std::regex парсинг номера телефона
От: Lexey Россия  
Дата: 06.12.17 17:55
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>но, видимо, нужна не группа 3, а группа 0 — всё выражение, или 1 — всё, что в корневых скобках.


Скорее 4:

std::string const s1(match[4].first, match[4].second);
"Будь достоин победы" (c) 8th Wizard's rule.
Re: std::regex парсинг номера телефона
От: jazzer Россия Skype: enerjazzer
Дата: 06.12.17 23:08
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>
МД>std::string pattern(R"(^((8|\\+420)[\\- ]?)?(\\(?\\d{3}\\)?[\\- ]?)?[\\d\\- ]{7,10}$)");
МД>


Ну ты либо крестик надень, либо трусы того.
В смысле, либо \\ в обычном литерале, либо R("") и тогда можно нормальные одиночные \ ставить.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: std::regex парсинг номера телефона
От: rg45 СССР  
Дата: 11.12.17 09:33
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Задачу в проекте закрыл, твой копирайт приписал, уехало в продакшен.


Там опечатку бы еще исправить: "exptract".
--
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.