Форум программистов, компьютерный форум, киберфорум
Наши страницы
Boost C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Waik
11 / 11 / 5
Регистрация: 23.04.2013
Сообщений: 64
1

Регулярное выражение в Boost

10.09.2014, 13:56. Просмотров 867. Ответов 16
Метки нет (Все метки)

Здравствуйте! Есть задача прочесть TXT файл и поверить строку на соответствие по следующим параметрам:
-в строке должна быть хотя бы одна буква и цифра
-нельзя допускать последовательный повторений из трех и более букв и цифр(пример: abc1hdft или fwewf456)
-нельзя допускать повтора одних и тех же букв или символов три и более раз подряд(aaagh584 или 111gueopepe).
Весь код выкладывать не буду, выложу только часть где происходит сама проверка:

C++
1
2
3
4
5
6
7
8
    boost::regex xRegEx("А регулярки нет");
    boost::smatch xResults;
    if(boost::regex_match(xStr,  xResults, xRegEx) ) {  //проверяем по регуляре 
        printf("-Ok\n");
    }
    else{
        printf("-No\n");
    }
Прощу помощи в составлении регулярного выражения по выше установленному условию.
p/s Проверил код на разных регулярках из инета и мне в любом случае в консоле выдает "-Ok", ошибка в коде ?


С Уважением, Waik/
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2014, 13:56
Ответы с готовыми решениями:

boost::regex определить регулярное выражение
Есть такие строки: (1) title=\"Динамика курса USD грн.\">USD...

Вывод результата (регулярное выражение)
Как можно вывести результат парсинга в мемо? char* out; wcstombs(out,...

Каким образом можно использовать регулярное выражение regex из .NET под С++
Работаю в VS Express 2012. Насколько понимаю, эта библиотека должна подключаться и к проекту на...

Boost начало работы: Undefined reference to `boost::system::generic_category() '
Добрый день Собственно говоря возникла необходимость использовать boost в работе. Поставил так: ...

Boost Log - undefined reference to `boost::system::system_category()'
Пытаюсь скомпилировать код из примеров Boost Log:#include <boost/log/trivial.hpp> int main(int,...

16
Avazart
Эксперт С++
7953 / 5774 / 571
Регистрация: 10.12.2010
Сообщений: 26,510
Записей в блоге: 17
10.09.2014, 17:06 2
Цитата Сообщение от Waik Посмотреть сообщение
-нельзя допускать последовательный повторений из трех и более букв и цифр(пример: abc1hdft или fwewf456)
Непонятно требование, где в примере повторения?
0
Waik
11 / 11 / 5
Регистрация: 23.04.2013
Сообщений: 64
10.09.2014, 19:23  [ТС] 3
Avazart , спасибо. Ошибся когда печатал.

-строка не может допускать групп из трех и более последовательных букв или цифр(например abc или 456)
0
Avazart
Эксперт С++
7953 / 5774 / 571
Регистрация: 10.12.2010
Сообщений: 26,510
Записей в блоге: 17
10.09.2014, 20:47 4
Цитата Сообщение от Waik Посмотреть сообщение
-нельзя допускать повтора одних и тех же букв или символов три и более раз подряд(aaagh584 или 111gueopepe).
Ну думаю достигнуть этого условия легче без регулярки, да и вообще возможно легче самому написать валидатор, регулярки как бы не очень подходят.
0
10.09.2014, 20:47
Waik
11 / 11 / 5
Регистрация: 23.04.2013
Сообщений: 64
10.09.2014, 21:05  [ТС] 5
Разве регулярка не будет работать быстрее чем собственные проверки с кучей циклов и хождений по строке?
0
Avazart
Эксперт С++
7953 / 5774 / 571
Регистрация: 10.12.2010
Сообщений: 26,510
Записей в блоге: 17
10.09.2014, 21:18 6
А с какого? Скорее наоборот, но вообще зависит от прямоты рук, если правильно реализуешь будет быстрее.

Регулярка универсальный инструмент, а значит изначально подразумевается потеря производительности по сравнению с каким то частным случаем.
0
DiffEreD
1445 / 782 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
10.09.2014, 22:05 7
Разве что так, через две регулярки:
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
int main()
{
    std::vector<std::string> v{
        "fhg4f5f",
        "f666f8g9t",
        "aaaa1aaaa",
        "11234",
        "1a1a1a1a",
        "1a1",
        "1a11a11aa",
        "a1",
        "a1a",
        "aa11a1aa11a1aa",
        "aa11a1aa11a1aa1",
        "aaagh584",
        "111gueopepe",
        "abc1hdft"
    };
 
    boost::regex reg1("(\\d{1,2}\\D{1,2}\\d{0,2})+");
    boost::regex reg2("(\\D{1,2}\\d{1,2}\\D{0,2})+");
    std::cout << std::boolalpha;
    for (auto& str : v) {
        if (!boost::regex_match(str, reg1))
        {
            std::cout << boost::regex_match(str, reg2) << " : " << str << "\n";
        }
        else
            std::cout << true << " : " << str << "\n";
    }
 
    return 0;
}
Добавлено через 45 минут
Хотя, можно еще и так:
C++
1
2
3
4
boost::regex reg(R"((\d{1,2}\D{1,2}\d{0,2})+|(\D{1,2}\d{1,2}\D{0,2})+)");
std::cout << std::boolalpha;
for (auto& str : v)
    std::cout << boost::regex_match(str, reg) << " : " << str << "\n";
2
Waik
11 / 11 / 5
Регистрация: 23.04.2013
Сообщений: 64
10.09.2014, 23:09  [ТС] 8
DiffEreD , большое спасибо. Но что то ругается он на букву R в регулярном выражении,

Выделяет строку
C++
1
(R"((\d{1,2}\D{1,2}\d{0,2})+|(\D{1,2}\d{1,2}\D{0,2})+)");
и говорит "Требуется круглая скобка"
0
DiffEreD
1445 / 782 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
10.09.2014, 23:19 9
Waik, это так называемые сырые строковые литералы. Если компилятор не поддерживает, то можно и без него, - просто надо будет экранировать каждый слеш и вместо \d писать \\d
0
Waik
11 / 11 / 5
Регистрация: 23.04.2013
Сообщений: 64
10.09.2014, 23:29  [ТС] 10
C++
1
2
3
4
5
6
7
8
9
10
11
printf("Input:");
    gets(pass);
    std::string xStr;
    xStr = (const char*) pass; // копируем переменную pass в переменную типа string
    boost::regex xRegEx("((\\d{1,2}\\D{1,2}\\d{0,2})+|(\\D{1,2}\\d{1,2}\\D{0,2})+)");
    if(boost::regex_match(xStr, xRegEx) ) { //проверяем по регуляре 
        printf("-Ok\n");
    }
    else{
        printf("-No\n");
    }
Все слеши экранировал, но что бы я не вводил в консоль я получаю "-No", видимо ошибка в моем коде.
0
DiffEreD
1445 / 782 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
10.09.2014, 23:45 11
У меня отрабатывает нормально. Ищи ошибку у себя. Кстати, какой компилятор?

Добавлено через 2 минуты
Проверил так:
C++
1
2
3
4
5
6
7
8
9
10
11
for (auto & xStr : v) {
        boost::regex xRegEx("((\\d{1,2}\\D{1,2}\\d{0,2})+|(\\D{1,2}\\d{1,2}\\D{0,2})+)");
        if(boost::regex_match(xStr, xRegEx) ) {
            printf("-Ok");
            std::cout << " : " << xStr << "\n";
        }
        else{
            printf("-No");
            std::cout << " : " << xStr << "\n";
        }
    }
Вывод:
-No : fhg4f5f
-No : f666f8g9t
-No : aaaa1aaaa
-No : 11234
-Ok : 1a1a1a1a
-No : 1a111
-Ok : 1a11a11aa
-Ok : a1
-Ok : a1a
-Ok : aa11a1aa11a1aa
-Ok : aa11a1aa11a1aa1
-No : aaagh584
-No : 111gueopepe
-No : abc1hdft
1
Waik
11 / 11 / 5
Регистрация: 23.04.2013
Сообщений: 64
11.09.2014, 00:17  [ТС] 12
MS VS c++ 2011 Express

Добавлено через 5 минут
Видимо перед проверкой когда я экранировал слеши, я забыл заново скомпилить проект.
Все ок. Большое спасибо!

Добавлено через 16 минут
Только вот почему-то такая комбинация символов 7nagkoaj получается невалидна, хотя удовлетворяет всем условиям.
-есть хотя бы одна буква и цифра
-нет групп из трех и более последовательных букв или цифр(например abc или 456)
-нет символов или цифр которые повторяются подряд три и более раз.
0
Avazart
Эксперт С++
7953 / 5774 / 571
Регистрация: 10.12.2010
Сообщений: 26,510
Записей в блоге: 17
11.09.2014, 00:20 13
Цитата Сообщение от Waik Посмотреть сообщение
7nagkoaj
Неудовлетворяет
Цитата Сообщение от Waik Посмотреть сообщение
-нет групп из трех и более последовательных букв или цифр(например abc или 456)
0
Waik
11 / 11 / 5
Регистрация: 23.04.2013
Сообщений: 64
11.09.2014, 00:41  [ТС] 14
Удовлетворяет. Я привел пример для этого условия, разъясню. Нельзя использовать три или более буквы которые идут подряд по алфавиту(abc, qrst), так-же и с цифрами(123, 456, 987).
0
Avazart
11.09.2014, 00:45
  #15

Не по теме:

Афигеть, может еще там по условию адронный коллайдер построить нужно?
Что еще утаили?

0
Waik
11 / 11 / 5
Регистрация: 23.04.2013
Сообщений: 64
11.09.2014, 00:58  [ТС] 16
К счастью коллайдер строить не нужно.
Вопрос другой, это можно решить регуляркой или проще своими методами ?

Добавлено через 7 минут
И если своими методами то что нужно убрать из регулярки что бы это условие она не проверяла?
0
S_el
2311 / 1738 / 369
Регистрация: 15.12.2013
Сообщений: 7,023
11.09.2014, 12:44 17
Цитата Сообщение от Waik Посмотреть сообщение
Вопрос другой, это можно решить регуляркой или проще своими методами ?
Проще своими, регулярка это шаблон поиска.Лично я такой шаблон придумать не могу.А проверять коды символов,чтобы не было 3-х подряд в цикле по строке можно.
0
11.09.2014, 12:44
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2014, 12:44

Использование boost и boost.build с несколькими компиляторами
Здравствуйте! Собрал библиотеку boost и boost.build для двух компиляторов: MinGW 4.5.2 и Visual...

Метапрограммирование в boost::proto (boost::spirit)
В библиотеке boost:: proto есть такой код calculator&lt;proto::terminal&lt;placeholder&lt;0&gt; &gt;::type&gt;...

Qt и boost boost::system::generic_category()
Добрый день Не подскажите как настроить Qt на работу с boost? У меня в принципе все работает:...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.