3 / 4 / 0
Регистрация: 29.05.2021
Сообщений: 64
1

Проблемы с RegEx

16.04.2022, 04:41. Показов 835. Ответов 6

Author24 — интернет-сервис помощи студентам
Здравствуйте. Есть задача: на вход даются две строки (если это важно, одинакового размера, написанные капсом без пробелов). Необходимо вывести наиболее длинную совпадающую подстроку. Я понимаю как ее решить через массив char и циклы, но не давно начал погружаться в regEx, поэтому хочется решить при помощи этого средства. Написал следующий код:
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
#include <iostream>
#include <regex>
#include <string>
#include <string.h>
 
int main() {
    int n;
    std::cin >> n;
    std::string cur;
    std::cin >> cur;
    std::string str = "";
    str.append(cur);
    str.push_back('a');
    std::cin >> cur;
    str.append(cur);
    std::cmatch result; 
    std::regex regular("([A-Z]+)[A-Z]*a[A-Z]*\1");
    std::string res = "";
    for (std::sregex_iterator i = std::sregex_iterator(str.begin(), str.end(), regular); 
        i != std::sregex_iterator(); i++) {
        std::smatch match = *i;
        std::cout << match.str(0) << " ";
    }
}
После запуска и ввода данных, например
DSEB
BDSE
Должно вывести все подстроки подходящие под условие (с длинной подстрок буду разбираться, когда этот этап пройду), но выводит одну пустую строку. Подскажите пожалуйста, что я делаю не так?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.04.2022, 04:41
Ответы с готовыми решениями:

Проблемы с regex
Всем привет,есть вопрос,не заходит в if (regex_search(s, temp, r)) для чтения строки,не знаю...

Проблемы с Regex
Имеется текст: &lt;div class=&quot;container&quot;&gt; &lt;div class=&quot;row&quot;&gt; &lt;div class=&quot;col-lg-12...

std::regex и boost::regex
Что-то я не пойму что реализация их различна ? #include &lt;iostream&gt; #include &lt;string&gt; ...

Проблемы с инетом, не отправляется почта, проблемы со связью с другой организацией
Здравствуйте. Есть проблемка. Такая ситуация - Организация. Компьютеры подключены по локалке....

6
Вездепух
Эксперт CЭксперт С++
11689 / 6368 / 1723
Регистрация: 18.10.2014
Сообщений: 16,051
16.04.2022, 04:51 2
Цитата Сообщение от Keworker Посмотреть сообщение
После запуска и ввода данных, например
DSEB
BDSE
Ничего не понял. В программе превым делом из входа читается некая int n. Что это за переменная? Зачем она нужна? Как это соответствует приведенному примеру входа?

Цитата Сообщение от Keworker Посмотреть сообщение
std::cmatch result;
...
std::string res = "";
Что это за переменные? Зачем они нужны?

Цитата Сообщение от Keworker Посмотреть сообщение
#include <string.h>
Что это здесь делает?
0
3 / 4 / 0
Регистрация: 29.05.2021
Сообщений: 64
16.04.2022, 04:55  [ТС] 3
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ничего не понял. В программе превым делом из входа читается некая int n. Что это за переменная? Зачем она нужна? Как это соответствует приведенному примеру входа?
Я немного перефразировал условие задачи, отбросил лишнее, вот оригинал.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что это за переменная? Зачем она нужна?
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что это здесь делает?
Это остатки от прошлых тестов, они не нужны в данном случае
0
Вездепух
Эксперт CЭксперт С++
11689 / 6368 / 1723
Регистрация: 18.10.2014
Сообщений: 16,051
16.04.2022, 04:59 4
Цитата Сообщение от Keworker Посмотреть сообщение
Я немного перефразировал условие задачи, отбросил лишнее, вот оригинал.
Это классно, но вы привели пример входа. И он не подходит для данного кода. Зачем нам тут такой пример входа?

Цитата Сообщение от Keworker Посмотреть сообщение
"([A-Z]+)[A-Z]*a[A-Z]*\1"
Символ \ в строковых литералах С и С++ обладаем особым статусом. \1 дает совсем не то, что вы хотели получить.

Цитата Сообщение от Keworker Посмотреть сообщение
match.str(0)
Это вернет всю проматченную строку. Вам же, кажется, нужна первая ()-группа: match.str(1).
1
3 / 4 / 0
Регистрация: 29.05.2021
Сообщений: 64
16.04.2022, 05:11  [ТС] 5
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это классно, но вы привели пример входа. И оно не подходит для данного кода. Заяем нам тут такой пример входа?
Можно рассматривать задачу как без числа, тогда код будет примерно такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <regex>
#include <string>
 
int main() {
    std::string cur;
    std::cin >> cur;
    std::string str = "";
    str.append(cur);
    str.push_back('a');
    std::cin >> cur;
    str.append(cur);
    std::regex regular("([A-Z]+)[A-Z]*a[A-Z]*\1");
    std::string res = "";
    for (std::sregex_iterator i = std::sregex_iterator(str.begin(), str.end(), regular); 
        i != std::sregex_iterator(); i++) {
        std::smatch match = *i;
        std::cout << match.str(1) << " ";
    }
}
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это вернет всю промачиенную строку. Вам же, кажется, нужна первая группа: match.str(1).
Да, вы правы, спасибо
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Символ \ в строковых литералах С и С++ обладаем особым статусом.
Насколько я понимаю, в данном случае я пишу регулярное выражение исходя из такой идеи: цикл должен перебирать все совпадения с этим выражением, и они должны выводиться на экран. \1 должен совпасть с первой скобкой, а как раз \\1 с \1, потому что мы экранируем. Но работает с экранированием \. Получается, что здесь конфликт C++ и regEx, и правила C++ в приоритете?

Добавлено через 2 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Символ \ в строковых литералах С и С++ обладаем особым статусом.
Теперь на примере
VOTEFORTHEGREATALBANIAFORYOU
CHOOSETHEGREATALBANIANFUTURE
вывело только O, разве этот цикл не должен перебирать все совпадения? O как я понимаю первое минимальное совпадение, но нам нужно наоборот, найти максимлаьное
0
Вездепух
Эксперт CЭксперт С++
11689 / 6368 / 1723
Регистрация: 18.10.2014
Сообщений: 16,051
16.04.2022, 06:29 6
Лучший ответ Сообщение было отмечено Keworker как решение

Решение

Цитата Сообщение от Keworker Посмотреть сообщение
Получается, что здесь конфликт C++ и regEx, и правила C++ в приоритете?
Тут нет никакого "конфликта C++ и regEx". Программу вы пишете на языке С++ и строковые литералы надо записывать по правилам языка С++. Компилятор С++ ничего не знает ни про какой "regEx". Для него строка в кавычках - это всегда просто строковый литерал. То есть для того, чтобы функция библиотеки regEx получила на вход \1 в строковом литерале должно быть написано \\1.

Цитата Сообщение от Keworker Посмотреть сообщение
разве этот цикл не должен перебирать все совпадения
Этот цикл будет перебирать все совпадения перемещаясь слева-направо по длине строки. Уже попавшая в совпадение часть строки считается "пройденной" и НЕ участвует в проверке на дальнейшие совпадения. То есть поиск ведется без перекрытий. Этот цикл не будет топаться на месте и перебирать все возможное варианты совпадения с перекрытиями.

При этом RegEx будет искать максимальное по длине совпадение. В данном примере первым будет найдено совпадение "OTEFORTHEGREATALBANIAFORYOUaCHOO", для которого match.str(1) вернет просто "O". После этого поиск будет выполняться в осташемся хвосте "SETHEGREATALBANIANFUTURE" и там, раумеется, ничего найдено не будет.

То есть такой подход не работает для решения вашей задачи. Он всегда будет находить максимум одно совпадение.
1
3 / 4 / 0
Регистрация: 29.05.2021
Сообщений: 64
16.04.2022, 10:25  [ТС] 7
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
То есть такой подход не работает для решения вашей задачи. Он всегда будет находить максимум одно совпадение.
Понял о чем вы. А как считаете, эта задача вообще может быть отнесена к теме регулярных выражений, или подходящие выражения составить нельзя?
0
16.04.2022, 10:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2022, 10:25
Помогаю со студенческими работами здесь

Новая видеокарта, новые проблемы №2. Проблемы с вводом и выводом звуков
После покупки более новой видеокарты и последующего подключения ее через hdmi кабель, на компьютере...

Yokogawa, шкаф, проблемы с драйвером на станции, проблемы соединения
Доброго времени суток, есть шкаф вот с таким оборудованием: Шкаф подключен к...

RegeX
Cтолкнулся с проблемой, надо вытащить данные между id=&quot; и &quot; lv &lt;fnd id=&quot;1042215&quot; lv=&quot;31&quot; /&gt;...

Regex
Хочу почитать что нибудь про регулярные выражения. Если кто знает хорошие статьи, киньте ссылочку....

RegEx
Помогите пожалуйста составить регулярное выражение. В общем есть html код в нем есть строка &lt;input...

regex
есть такой нубокод package Sample; import java.io.BufferedReader; import java.io.File; import...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru