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

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

Войти
Регистрация
Восстановить пароль
 
Nikitko_Cent
143 / 113 / 12
Регистрация: 27.10.2011
Сообщений: 682
Завершенные тесты: 3
#1

Регулярные выражения (ECMAScript) - C++

14.11.2015, 18:11. Просмотров 320. Ответов 8
Метки нет (Все метки)

Никак не могу разобраться с регулярными выражениями

Объясните, пожалуйста, на пальцах, что "делают" круглые скобки в регулярках

Ещё помогите составить шаблон для вот такой строки (желательно с объяснениями):
[любое количество пробельных символов]#R[любое количество пробельных символов]B|b[любое количество цифр (в том числе нулевое)][любое количество пробельных символов]\[любое количество пробельных символов]S|s[любое количество цифр (в том числе нулевое)]

Пример:
#R b01281/ S
#R B0243/S58671
Буду премного благодарен
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2015, 18:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Регулярные выражения (ECMAScript) (C++):

Регулярные выражения - C++
Можете подсказать что это значит? "Max-Forwards*(\d{3,}|7)" я без понятия что это и откуда это( Добавлено через 4 минуты я уже...

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

Регулярные выражения в с++ - C++
Рылся рылся, нигде не нашел... Кто нибудь, объясните: 1) как установить эту библиотеку Regex. 2) Как заставить её работать. 3) И...

Регулярные выражения - C++
Привет помогите составить регулярное выражение, чтобы парсить такую строку: , , результатом должно быть: a hello world any ...

Регулярные выражения - C++
Может кто нибудь подсказать реализацию регулярных выражений на С/С++?

Регулярные выражения - C++
Помогите написать регулярку. Пишу на RE2. Если в тексте встречается ******.moikrug.ru то нужно вытащить то что под звездочками. Буду...

8
Kastaneda
Нарушитель
Эксперт С++
4671 / 2875 / 233
Регистрация: 12.12.2009
Сообщений: 7,307
Записей в блоге: 2
Завершенные тесты: 1
14.11.2015, 19:33 #2
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
Объясните, пожалуйста, на пальцах, что "делают" круглые скобки в регулярках
Круглые скобки "захватывают" результат. Регулярки приминяются в двух случах - 1. проверить соответсвтует ли строка регулярному выражению и 2. найти что-то, что соответсвует этому регулярному выражению.
Во втором случае может потребоваться результат не всего регулярного выражения, а его части. В этом случае эту часть оборачивают в круглые скобки.

Добавлено через 4 минуты
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
[любое количество пробельных символов]#R[любое количество пробельных символов]B|b[любое количество цифр (в том числе нулевое)][любое количество пробельных символов]\[любое количество пробельных символов]S|s[любое количество цифр (в том числе нулевое)]
Bash
1
"[\\s+]#R[\\s+](?:B:b)[\\s*][\\s+]\\[\\s+](?:S|s)[\\s*]
писал на коленке, не проверял

Не по теме:

Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
желательно с объяснениями
Слегка не в том состоянии

0
Nikitko_Cent
143 / 113 / 12
Регистрация: 27.10.2011
Сообщений: 682
Завершенные тесты: 3
15.11.2015, 11:28  [ТС] #3
Цитата Сообщение от Kastaneda Посмотреть сообщение
Круглые скобки "захватывают" результат. Регулярки приминяются в двух случах - 1. проверить соответсвтует ли строка регулярному выражению и 2. найти что-то, что соответсвует этому регулярному выражению.
Во втором случае может потребоваться результат не всего регулярного выражения, а его части. В этом случае эту часть оборачивают в круглые скобки.
Спасибо. А можно ли сделать так, чтобы если строка подходит под шаблон, то после выполнения:

C++
1
2
std::smatch m;
std::regex_search(in, m, std::regex(tmpl));
В m не было этой строки целиком, а лишь указанные мной группы захвата?

Добавлено через 2 минуты
Цитата Сообщение от Kastaneda Посмотреть сообщение
Bash
1
[\\s+]#R[\\s+](?:B:b)[\\s*][\\s+]\\[\\s+](?:S|s)[\\s*]
Эта штука вообще вызывает эксцепшн.

Если кому интересно, то сделал вот так:
C++
1
[ |\\t]*#R[ |\\t]*([B|b][0-9]*)[ |\\t]*/[ |\\t]*([S|s][0-9]*)

Не по теме:

Добавлено через 1 минуту

Цитата Сообщение от Kastaneda Посмотреть сообщение

Не по теме:

Слегка не в том состоянии

Суббота, понимаю

0
S_el
2109 / 1628 / 308
Регистрация: 15.12.2013
Сообщений: 6,523
15.11.2015, 12:46 #4
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
В m не было этой строки целиком, а лишь указанные мной группы захвата?
Извлекайте индексированием нужные группы.
0
Nikitko_Cent
143 / 113 / 12
Регистрация: 27.10.2011
Сообщений: 682
Завершенные тесты: 3
15.11.2015, 13:42  [ТС] #5
Цитата Сообщение от S_el Посмотреть сообщение
Извлекайте индексированием нужные группы.
Понял.

А как указать в шаблоне, что перед искомой подстрокой могут быть только пробельные символы?, т.е.

[любое количество ТОЛЬКО пробельных символов]#R[любое количество ТОЛЬКО пробельных символов]B|b[любое количество цифр (в том числе нулевое)][любое количество ТОЛЬКО пробельных символов]\[любое количество ТОЛЬКО пробельных символов]S|s[любое количество цифр (в том числе нулевое)]
0
S_el
2109 / 1628 / 308
Регистрация: 15.12.2013
Сообщений: 6,523
15.11.2015, 13:45 #6
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
А как указать в шаблоне, что перед искомой подстрокой могут быть только пробельные символы?
для обозначения пробельных символов - \s
0
Nikitko_Cent
143 / 113 / 12
Регистрация: 27.10.2011
Сообщений: 682
Завершенные тесты: 3
15.11.2015, 13:59  [ТС] #7
Цитата Сообщение от S_el Посмотреть сообщение
для обозначения пробельных символов - \s
проблема в том, что если у меня перед искомой подстрокой будет, например :
"1 "
То такая строка будет попадать под шаблон, а мне этого не надо

Добавлено через 3 минуты
Т.е. фактически мне нужно сделать так, что если подстрока попадает под шаблон, приведённый мною ранее, то её префикс обязан быть пуст

Добавлено через 7 минут
Примеры:
#R b01281/ S
- Подходит
#R b01281/ S
- Подходит
1#R b01281/ S
- Не подходит
1#R b01281/ S
- Не подходит
1 #R b01281/ S
- Не подходит
1 #R b01281/ S
- Не подходит
0
Kastaneda
Нарушитель
Эксперт С++
4671 / 2875 / 233
Регистрация: 12.12.2009
Сообщений: 7,307
Записей в блоге: 2
Завершенные тесты: 1
15.11.2015, 14:34 #8
\s - 1 пробел
\s+ - любое кол-во пробелов
\s* - любое кол-во пробелов, в том числе ноль
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
Т.е. фактически мне нужно сделать так, что если подстрока попадает под шаблон, приведённый мною ранее, то её префикс обязан быть пуст
"^#R"
^ в данном случае означает начало строки.
1
Nikitko_Cent
143 / 113 / 12
Регистрация: 27.10.2011
Сообщений: 682
Завершенные тесты: 3
15.11.2015, 16:50  [ТС] #9
Видимо, вот окончательный вариант:
C++
1
const std::regex rule2("^[[:space:]]*#R[[:space:]]+([B|b][0-9]*)[[:space:]]*/[[:space:]]*([S|s][0-9]*)");
Оставил [[:space:]] для наглядности
0
15.11.2015, 16:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2015, 16:50
Привет! Вот еще темы с ответами:

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

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

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

Регулярные выражения на C++ - C++
Здраствуйте, возникла необходимость использовать регурные выражения в Си++. Первое что пришло в голову переписать все на Qt например,...


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

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

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