Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602

Захват текста регуляркой на разных итерациях цикла

30.12.2020, 03:36. Показов 748. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос к знатокам - нижеприведенное выражение по стандарту работает всегда одинаково или в зависимости от реализации?
Поясняю: первая итерация * захватывает a, вторая - b. После чего бекреференс использует текст захваченный на первой итерации. Хотя мне казалось, что захваченное на первой итерации должно было сброситься на второй.
C++
1
2
3
4
    std::regex regex("((a)|(b))*\\2");
    std::match_results<const char*> results;
    if(std::regex_match("aba",results,regex))
        std::cout<<"Hmm"<<std::endl;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.12.2020, 03:36
Ответы с готовыми решениями:

Сравнение значений массива в разных итерациях
Здравсвуйте, это мой первый вопрос на данном форуме, сильно не пинайте. Суть такова, пытаюсь реализовать изменения в корзине в одной CMS...

Замена текста с регуляркой
В статьях встречаются макросы вида: {} Где 37539 - id картинки из базы, нужно вытащить это id, и заменить весь макрос {} на строку - пути...

Парсинг текста регуляркой
Доброго времени суток. Есть тект &quot;paymentStatus&quot;:&quot;not-paid&quot;,&quot;leftDays&quot;:46,&quot;billDate&quot;:&quot;23.05.2017&quot;,&quot;billFor&quot;:&quot;Штраф по...

9
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
30.12.2020, 10:07
Цитата Сообщение от Renji Посмотреть сообщение
Поясняю: первая итерация * захватывает a, вторая - b. После чего бекреференс использует текст захваченный на первой итерации. Хотя мне казалось, что захваченное на первой итерации должно было сброситься на второй.
А где у тебя здесь итерации?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
30.12.2020, 14:59  [ТС]
((a)|(b)) захватывает один символ. Квантификатор * делает любое количество таких захватов. Ну вот каждый из этих захватов я назвал итерацией.
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,096
30.12.2020, 15:14
Цитата Сообщение от Renji Посмотреть сообщение
((a)|(b)) захватывает один символ
вообще-то, аж три

а вот так два
Code
1
(a|b)(.*)\1
для строки "abca": a - это окружающие символы, bc - "окружённые"

Добавлено через 2 минуты
соответственно, abcabndb
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
30.12.2020, 15:54  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
вообще-то, аж три
Пишет что один. Откуда три?
C++
1
2
3
4
    std::regex regex("((a)|(b))");
    std::match_results<const char*> results;
    if(std::regex_search("aba",results,regex))
        std::cout<<results[1].length()<<std::endl;
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,096
30.12.2020, 16:02
Renji, три скобки - три захвата
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
30.12.2020, 16:04  [ТС]
Третья скобка не срабатывает. В этом, собственно, и затык - сработать должна либо вторая скобка, либо третья. Но выражение из стартпоста работает так, как будто выстрелили обе.
C++
1
2
3
4
    std::regex regex("((a)|(b))");
    std::match_results<const char*> results;
    if(std::regex_search("aba",results,regex))
        std::cout<<results[3].matched<<std::endl;
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,096
30.12.2020, 16:12
Renji, http://myregexp.com/ вот, потестируй. Для начал введи вверху ((a)|(b)) , а внизу a

в самом низу увидишь результат захвата:
0 - вся строка
1 - содержимое внешних скобок
2 - содержимое первой внутренней скобки
3 - содержимое второй внутренней скобки


чтобы скобки не захватывали, а только группировали, нужно сразу после открывающей скобки поставить ?:
((?:a)|(?:b))
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
30.12.2020, 16:21  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Renji, http://myregexp.com/ вот, потестируй.
Потестировал. Там для ((a)|(b))* на aba выстрелила только вторая скобка, в третьей null. У g++ выстрелили обе. Так возвращаемся к исходному вопросу - стандарт то что на эту тему говорит, должны стрелять обе скобки или бабушка надвое сказала?
C++
1
2
3
4
    std::regex regex("((a)|(b))*");
    std::match_results<const char*> results;
    if(std::regex_match("aba",results,regex))
        std::cout<<results[2].matched<<" "<<results[3].matched<<std::endl;
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,096
30.12.2020, 16:41
Renji, насчёт стандарта мне неизвестно, но вот такое (a)|(b) - на мой взгляд из разряда UB

а вот так - всё ок
(a|b)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.12.2020, 16:41
Помогаю со студенческими работами здесь

Вырезать регуляркой кусок текста с разными условиями
Здравствуйте. Есть определенный кусок текста. Необходимо начиная с определенных слов (особенности репака, особенности repack и т.д.)...

Сохранение форматирования текста при обработке регуляркой
Возникла проблема, мне нужно сохранив форматирование текста удалить html теги. Я сохранил все форматирование...

Очистка повторяющегося в произвольном количестве текста регуляркой
Всем привет! Подскажите пожалуйста, как сделать регуляркой следующую штуку (если это вообще возможно). Есть такой текст: Еще...

Захват разных агентов на 1 заявку
Поступает заказ, который должен выполнить либо агент1 либо агент2, по мере того как они освобождаются. Если свободных агентов нет -...

Захват звука для Skype с двух разных микрофонов
Можно как то настроить Skype, что бы одновременно звук шел и в веб камеру и микрофон в наушниках? Вот воспроизводится ( я слышу и с...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru