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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ems2811
2 / 2 / 0
Регистрация: 14.04.2009
Сообщений: 36
#1

Регулярные выражения с игнорированием спецсимволов - C++

21.07.2014, 22:29. Просмотров 508. Ответов 8
Метки нет (Все метки)

Здравствуйте. Решил попробовать регулярные выражения в Visual C++ 2010. Задача такая: пользователь вводит (считывается параметр) текст и его нужно преобразовать в регулярку с игнорированием всех спецсимволов. Использую стандартную библиотеку <regex>. Предположим что пользователь ввел: .txt, хотя в данном случае он сработает правильно, но если в исходной строке (l) вместо точки будет другой символ, сравнение пройдет успешно, но не верно
этот пример даст FALSE
C++
1
2
3
wstring l=L"dstyf.txt";
wregex r(L".*\Q.txt\E.*");
bool t=regex_match(l,r);
этот пример даст ошибку
C++
1
2
3
wstring l=L"dstyf.txt";
wregex r(L".*\\Q.txt\\E.*");
bool t=regex_match(l,r);
Вопрос: в C++ существуют выражения (спец символы) \Q \E, а то при попытке их использовать ничего не выходит. Или придется создавать функцию экранирующую каждый символ?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2014, 22:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Регулярные выражения с игнорированием спецсимволов (C++):

Регулярные выражения - C++
Составить регулярное выражение, пропускающее строки, содержащие хотя бы по разу каждую из трех первых букв вашей фамилии(Например, фамилия...

Регулярные выражения - C++
Всем доброе утро. Ребята подскажите что не так в выражении вот шаблон регулярного выражения ^*,&quot;(*)&quot;,&quot;(*)&quot; а срочку которую отправляю...

Регулярные выражения в g++ - C++
Привет всем! этот пример взял из http://www.cplusplus.com/reference/regex/regex_search/ и скомпилировал g++ . #include &lt;iostream&gt; ...

Регулярные выражения - C++
Здравствуйте, Надо заменить в тексте номер телефона формата (012) 345-67-89 на +380 12 345 67 89. Помогите, пожалуйста, как должны...

С++ и регулярные выражения - C++
С++ и регулярные выражения - возможно ли ето? Какие есть библиотеки или что-то в етом роде?

регулярные выражения - C++
прочитал статю http://www.opennet.ru/base/dev/pcre_cpp.txt.html про регулярные выражения в c++ неужели там мноо кода нужно писать? ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
22.07.2014, 00:05 #2
Для этого есть Сырые строковые литералы
0
ems2811
2 / 2 / 0
Регистрация: 14.04.2009
Сообщений: 36
22.07.2014, 21:34  [ТС] #3
Это для 2011, пишу на 2010. у него есть аналоги?
0
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
22.07.2014, 22:06 #4
Других вариантов мне не известно. А что мешает обновить компилятор или IDE для поддержки С++11?
0
ems2811
2 / 2 / 0
Регистрация: 14.04.2009
Сообщений: 36
29.07.2014, 22:28  [ТС] #5
На сколько-то забросил дело, но вернувшись сменил среду на VS Express 2013. Но видимо недопонял про сырые строковые литералы. В данном примере значение t=true, хотя ожидается false (тк точка должна быть в части строки l)
C++
1
2
3
4
wstring mask = LR"(.txt)";
wregex r(L".*" + mask + L".*");
wstring l=L"dstyf8txt";
bool t=regex_match(l,r);
подскажите на данном примере как добится чтоб результатом был false, а при смене строки l=L"4tge.txt" результат стал true
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
29.07.2014, 22:42 #6
ems2811,
C++
1
wstring mask = LR"(\.txt)";
0
ems2811
2 / 2 / 0
Регистрация: 14.04.2009
Сообщений: 36
29.07.2014, 23:16  [ТС] #7
тут идея в том чтобы полностью экранировать все символы в mask. Для примера выше даже сырые строковые литералы не нужны. А как сделать через них дабы не экранировать каждый символ. Только из-за них перешёл на 2013
0
igorrr37
1647 / 1275 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
30.07.2014, 00:02 #8
boost::regex нормально отрабатывает, а вот <regex> из vs2012 бросает ошибку на символы \\Q\\E. Вот рабочий пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <string>
#include <boost/regex.hpp>
 
int main()
{
    std::wstring sreg;
    std::getline(std::wcin, sreg);
    sreg = L"\\Q" + sreg + L"\\E";
    boost::wregex reg(L".*" + sreg + L".*");
    std::wstring str(L"vbvb8txt");
    std::cout << boost::regex_match(str, reg) << '\n';
    return 0;
}
0
ems2811
2 / 2 / 0
Регистрация: 14.04.2009
Сообщений: 36
30.07.2014, 09:08  [ТС] #9
Так сейчас среда то VS 2013. Можно ли обойтись без установки boost?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2014, 09:08
Привет! Вот еще темы с ответами:

[C++] Регулярные выражения - C++
Знаю что в стандарте С нет регулярных выражений. Хочу попробывать собрать простую функцию поиска по шаблону регулярных выражений. ...

Регулярные выражения - C++
Ребят, у меня тут проблемы. В файле input.txt есть строчки, в которых нужно найти вес, т.е., например, 221 kg, 45g и отправить их в аутпут....

Регулярные выражения - C++
Как записать строки у тегов &lt;c&gt;&lt;/c&gt; и &lt;v&gt;&lt;/v&gt;? &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;yes&quot;?&gt; &lt;worksheet...

Регулярные выражения - C++
Доброй ночи! Использую вот такой код void INITDIALOG(void* p){ char* bufer = new char; server.GetLocList(bufer); char * t =...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.07.2014, 09:08
Ответ Создать тему
Опции темы

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