+ Ответить в теме
Страница 1 из 2
1 2 ПоследняяПоследняя
Показано с 1 по 10 из 12

Тема: Регулярные выражения

  1. #1
    dummy hqhihi is on a distinguished road
    Регистрация
    05.12.2017
    Возраст
    21
    Сообщений
    6
    Вес репутации
    0

    По умолчанию Регулярные выражения

    Привет всем!
    Изучаю с++, начал тему регулярные выражения, и немного не понятна эта тема, решил для себя реализовать пару задач, одна из них это проверка мак адреса, то есть пользователь вводит что то похожее на мак адрес и ему должен прилететь ответ, правильно ли он написал его.
    Мне бы объяснить немного, если можно код с комментариями, если не выйдет, то хотя бы мысль с чего и как начать.
    Шаблон вроде как вот этот подойдет: ^([0-9A-Fa-f]{2}-){5}([0-9A-Fa-f]{2})$
    Может кто додумать, как реализовать? Или если есть что то подобное на этом форуме, то ссылкой поделитесь пожалуйста.
    Спасибо.

  2. По умолчанию

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #2
    Moderator Куратор
    system architect
    Absurd is on a distinguished road
    Регистрация
    26.02.2004
    Адрес
    Pietari, Venäjä
    Возраст
    38
    Сообщений
    1,213
    Вес репутации
    17

    По умолчанию Re: Регулярные выражения

    Цитата Сообщение от hqhihi Посмотреть сообщение
    Привет всем!
    Изучаю с++, начал тему регулярные выражения, и немного не понятна эта тема, решил для себя реализовать пару задач, одна из них это проверка мак адреса, то есть пользователь вводит что то похожее на мак адрес и ему должен прилететь ответ, правильно ли он написал его.
    Мне бы объяснить немного, если можно код с комментариями, если не выйдет, то хотя бы мысль с чего и как начать.
    Шаблон вроде как вот этот подойдет: ^([0-9A-Fa-f]{2}-){5}([0-9A-Fa-f]{2})$
    Может кто додумать, как реализовать? Или если есть что то подобное на этом форуме, то ссылкой поделитесь пожалуйста.
    Спасибо.
    Это все классические алгоритмы которые были придуманы более 40 лет назад и с тех пор особо не изменялись. В данном случае это конечные автоматы. Есть два типа конечных автоматов - детерминированный и недетерминированный. Детерминированный идет циклом по регекспу и смотрит в текст, недетерминированный идет циклом по тексту и смотрит в регексп. Перловые - недетерминированные.
    2B OR NOT(2B) = FF

  4. #3
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    36
    Сообщений
    3,089
    Вес репутации
    21

    По умолчанию Re: Регулярные выражения

    Какая стоит задача? Реализовать свою поддержку регулярных выражений (тренировочная цель) или достигнуть результата (коммерческая цель)?

    Первый вариант осветил Absurd, так что отвечу по второму.

    В С++, начиная с 11-го стандарта в наличие библиотечная поддержка регулярных выражений. Смотри класс regex, дальше двигайся по ссылкам. Если твой компилятор не поддерживает C++11, то твоё решение - это колыбель будущих стандартов библиотека boost. В ней класс доступен с тем именем и тем же набором методов. Отличие будет только в неймспейсе.
    Entites should not be multiplied beyond necessity @ William Occam
    ---
    Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
    ---
    Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

  5. #4
    Moderator Куратор
    system architect
    WinMain will become famous soon enough Аватар для WinMain
    Регистрация
    14.01.2005
    Адрес
    Москва
    Сообщений
    912
    Вес репутации
    15

    По умолчанию Re: Регулярные выражения

    Библиотеки регулярных выражений в том или ином виде сейчас есть практически во всех крупных С++ фрэймворках.
    Вот несколько примеров: класс QRegExp в Qt и класс wxRegEx из wxWidgets.
    Поэтому, если создаёшь приложение на базе какого-то крупного фрэймворка, то лучше сначала изучить его имеющиеся возможности, а так же средства стандартных библиотек самого языка программирования.
    Для тех, кто программирует на Visual C++, там тоже есть своя небольшая поддержка регулярных выражений в библиотеке ATL (заголовочный файл atlrx.h), которая появилась ещё до принятия стандарта С++11.
    Приглашаю на свой сайт http://winmain.org

  6. #5
    dummy hqhihi is on a distinguished road
    Регистрация
    05.12.2017
    Возраст
    21
    Сообщений
    6
    Вес репутации
    0

    По умолчанию Re: Регулярные выражения

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

  7. #6
    Moderator Куратор
    system architect
    Absurd is on a distinguished road
    Регистрация
    26.02.2004
    Адрес
    Pietari, Venäjä
    Возраст
    38
    Сообщений
    1,213
    Вес репутации
    17

    По умолчанию Re: Регулярные выражения

    Цитата Сообщение от hqhihi Посмотреть сообщение
    По сути нет конкретной задачи, мне для себя хотелось бы посмотреть на код или примерный код, я представляю как это реализовать без регулярных выражений, но с ними не получается, я выше шаблон написал, и то не уверен в его правильности.
    А в чем проблема? Чего конкретно не получается?
    Код :
    1. #include <iostream>
    2. #include <sstream>
    3. #include <regex>
    4.  
    5. int main()
    6. {
    7.     std::cout << "Enter string :";
    8.     std::string str;
    9.     std::getline(std::cin, str);
    10.     if (std::regex_match(str, std::regex(R"(^([0-9A-Fa-f]{2}-){5}([0-9A-Fa-f]{2})$)"))) {
    11.         std::cout << "\nString looks like MAC";
    12.     } else {
    13.         std::cout << "\nString doesn't look like MAC";
    14.     }
    15.     return 0;
    16. }
    2B OR NOT(2B) = FF

  8. #7
    dummy hqhihi is on a distinguished road
    Регистрация
    05.12.2017
    Возраст
    21
    Сообщений
    6
    Вес репутации
    0

    По умолчанию Re: Регулярные выражения

    Цитата Сообщение от Absurd Посмотреть сообщение
    А в чем проблема? Чего конкретно не получается?
    Код :
    1. #include <iostream>
    2. #include <sstream>
    3. #include <regex>
    4.  
    5. int main()
    6. {
    7.     std::cout << "Enter string :";
    8.     std::string str;
    9.     std::getline(std::cin, str);
    10.     if (std::regex_match(str, std::regex(R"(^([0-9A-Fa-f]{2}-){5}([0-9A-Fa-f]{2})$)"))) {
    11.         std::cout << "\nString looks like MAC";
    12.     } else {
    13.         std::cout << "\nString doesn't look like MAC";
    14.     }
    15.     return 0;
    16. }
    Этот шаблон и тот что выше, они одинаковы, как я понимаю? И если я ввиду regex_search вместо match, то он все ровно проверяет, то получается разницы нет? Спасибо
    "[0-9a-f]{2}-[0-9a-f]{2}"
    Последний раз редактировалось hqhihi; 06.12.2017 в 11:29.

  9. #8
    Moderator Куратор
    system architect
    Absurd is on a distinguished road
    Регистрация
    26.02.2004
    Адрес
    Pietari, Venäjä
    Возраст
    38
    Сообщений
    1,213
    Вес репутации
    17

    По умолчанию Re: Регулярные выражения

    Цитата Сообщение от hqhihi Посмотреть сообщение
    Этот шаблон и тот что выше, они одинаковы, как я понимаю?
    Ну да, я просто скопипастил ваш регексп. R"(...)" это сравнительно новая конструкция (С++11 или 14) для "сырых" ("raw") строк С++, которые никак не обрабатываются компилятором. Для регекспов лучше использовать именно такие, поскольку язык регекспов активно использует символ '\', а это служебный символ во могих языках включая С++.

    Цитата Сообщение от hqhihi Посмотреть сообщение
    И если я ввиду regex_search вместо match, то он все ровно проверяет, то получается разницы нет? Спасибо
    regex_search возвращает true если в исходной строке есть хотябы одно вхождение регекспа, regex_match проверяет соответствие строки регексу целиком.
    2B OR NOT(2B) = FF

  10. #9
    dummy hqhihi is on a distinguished road
    Регистрация
    05.12.2017
    Возраст
    21
    Сообщений
    6
    Вес репутации
    0

    По умолчанию Re: Регулярные выражения

    Цитата Сообщение от Absurd Посмотреть сообщение
    Ну да, я просто скопипастил ваш регексп. R"(...)" это сравнительно новая конструкция (С++11 или 14) для "сырых" ("raw") строк С++, которые никак не обрабатываются компилятором. Для регекспов лучше использовать именно такие, поскольку язык регекспов активно использует символ '\', а это служебный символ во могих языках включая С++.


    regex_search возвращает true если в исходной строке есть хотябы одно вхождение регекспа, regex_match проверяет соответствие строки регексу целиком.
    regex_match не работает при вводе 4r-4t-32-33-2r-r3 к примеру. С regex_search все работает, выходит ошибка в шаблоне?

  11. #10
    dummy hqhihi is on a distinguished road
    Регистрация
    05.12.2017
    Возраст
    21
    Сообщений
    6
    Вес репутации
    0

    По умолчанию Re: Регулярные выражения

    Цитата Сообщение от hqhihi Посмотреть сообщение
    regex_match не работает при вводе 4r-4t-32-33-2r-r3 к примеру. С regex_search все работает, выходит ошибка в шаблоне?
    Не то вводил, все работает. Спасибо

+ Ответить в теме
Страница 1 из 2
1 2 ПоследняяПоследняя

Похожие темы

  1. Регулярные выражения в С++
    Обыскал все и вся, но ничего толкового не нашел. Есть ли в С++ возможность проверки регулярных выражений штатными средствами? Или только из...
    от Dragon в разделе C и C++
  2. Регулярные выражения
    Какие книги вы можете предложить по регулярным выражениям?
    от WarMaster в разделе Вопрошайка
  3. Регулярные выражения
    Подскажите пожалуйста, не селён в рег. выражениях, как использую регулярные выражения вытянуть из строки последовательность выражений после каждой...
    от Richard в разделе Java
  4. Регулярные выражения
    Подскажите пожалуйста, мне нужно найти в строке выражение вида и заменить его на <font color=10af7c>. Ну как видно мне это нужно для замены...
    от pashtet в разделе Perl, PHP, ASP ...
  5. Регулярные выражения в Delphi...
    Имеются ли в Delphi средства, для обработки текста, на подобии регулярных выражений (например как в Perl 8) )?
    от Stalker в разделе Delphi и Pascal

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения