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

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

Восстановить пароль Регистрация
 
Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 627
Завершенные тесты: 2
14.11.2015, 18:11     Регулярные выражения (ECMAScript) #1
Никак не могу разобраться с регулярными выражениями

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

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

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

C++ регулярные выражения
[C++] Регулярные выражения C++
Регулярные выражения C++
C++ Регулярные выражения
C++ Регулярные выражения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
14.11.2015, 19:33     Регулярные выражения (ECMAScript) #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 Посмотреть сообщение
желательно с объяснениями
Слегка не в том состоянии

Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 627
Завершенные тесты: 2
15.11.2015, 11:28  [ТС]     Регулярные выражения (ECMAScript) #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 Посмотреть сообщение

Не по теме:

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

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

S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,913
15.11.2015, 12:46     Регулярные выражения (ECMAScript) #4
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
В m не было этой строки целиком, а лишь указанные мной группы захвата?
Извлекайте индексированием нужные группы.
Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 627
Завершенные тесты: 2
15.11.2015, 13:42  [ТС]     Регулярные выражения (ECMAScript) #5
Цитата Сообщение от S_el Посмотреть сообщение
Извлекайте индексированием нужные группы.
Понял.

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

[любое количество ТОЛЬКО пробельных символов]#R[любое количество ТОЛЬКО пробельных символов]B|b[любое количество цифр (в том числе нулевое)][любое количество ТОЛЬКО пробельных символов]\[любое количество ТОЛЬКО пробельных символов]S|s[любое количество цифр (в том числе нулевое)]
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,913
15.11.2015, 13:45     Регулярные выражения (ECMAScript) #6
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
А как указать в шаблоне, что перед искомой подстрокой могут быть только пробельные символы?
для обозначения пробельных символов - \s
Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 627
Завершенные тесты: 2
15.11.2015, 13:59  [ТС]     Регулярные выражения (ECMAScript) #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
- Не подходит
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
15.11.2015, 14:34     Регулярные выражения (ECMAScript) #8
\s - 1 пробел
\s+ - любое кол-во пробелов
\s* - любое кол-во пробелов, в том числе ноль
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
Т.е. фактически мне нужно сделать так, что если подстрока попадает под шаблон, приведённый мною ранее, то её префикс обязан быть пуст
"^#R"
^ в данном случае означает начало строки.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2015, 16:50     Регулярные выражения (ECMAScript)
Еще ссылки по теме:

C++ Регулярные выражения
Регулярные выражения C++
C++ Регулярные выражения

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

Или воспользуйтесь поиском по форуму:
Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 627
Завершенные тесты: 2
15.11.2015, 16:50  [ТС]     Регулярные выражения (ECMAScript) #9
Видимо, вот окончательный вариант:
C++
1
const std::regex rule2("^[[:space:]]*#R[[:space:]]+([B|b][0-9]*)[[:space:]]*/[[:space:]]*([S|s][0-9]*)");
Оставил [[:space:]] для наглядности
Yandex
Объявления
15.11.2015, 16:50     Регулярные выражения (ECMAScript)
Ответ Создать тему
Опции темы

Текущее время: 06:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru