Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
4 / 3 / 6
Регистрация: 13.11.2015
Сообщений: 217

Создание регуляторки regex

24.01.2017, 17:42. Показов 1261. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте. У меня тут проблема с созданием выражения, помогите пожалуйста. Сейчас само выражение у меня такое:
<text>((\\d|\\w|.)(?:[a-zA-Z0-9А-Яа-я]*)(.+))</text> , и должно находить любой текст между этими двумя тэгами (слово, символ, цифра и тд).
Но оно будет ловить информацию однострочно, тоесть когда <text> и </text> будут на 1 строке, а не на разных.. А мне нужно наоборот как раз.
Допустим, строку:
XML
1
<text>Привет) Как дела? 123</text>
regex будет видеть, а такое (с переносами строк (\n)):
XML
1
2
3
4
5
<text>
Привет) 
Как дела? 
123
</text>
уже нет. Помогите пожалуйста правильно составить это выражение, я не очень силен в этом)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.01.2017, 17:42
Ответы с готовыми решениями:

Создание Regex, строки, начинающиеся с цифр
Здравствуйте, уважаемые! Требуется создать regex для отбора лишь тех строк, которые выполняют условиям: ... начинаются только с...

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

regex
написал регулярное выражение чтобы совпадали строки вида начало строки число либо число. конец строки написал такое выражение ...

6
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
24.01.2017, 18:41
У меня проблема.
Хочу решить её с помощью регулярных выражений.
У меня две проблемы


Добавлено через 1 минуту
Цитата Сообщение от Vasiliyy Посмотреть сообщение
а такое (с переносами строк (\n)):
Так считайте всё содержимое в строку вместе с символами переноса строк.

Добавлено через 1 минуту
Или надо, чтобы он воспринимал только варианты с переносами строк, а когда всё на одной строке - отбраковывал?

Добавлено через 13 минут
Вот так работает с переносами строк:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <fstream>
#include <iostream>
#include <iterator>
#include <regex>
#include <string>
 
int main()
{
    std::ifstream ifs("input.txt");
    if (!ifs)
        return 1;
    std::cout << std::boolalpha << std::regex_match(std::string(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>()), std::regex("<text>(.|\\s)*</text>"));
}
Сама регулярка имеет вид <text>(.|\s)*</text>
0
4 / 3 / 6
Регистрация: 13.11.2015
Сообщений: 217
24.01.2017, 20:37  [ТС]
MrGluck, данное выражение конечно работает, но слишком уж много захватывает текста))
Вот ниже на скрине горизонтальная линия - это до куда мне нужно чтобы определяло, но оно и ниже захватывает тоже.. Тоесть нужно чтобы захватывало только содержимое тэга <text>, а не так как сейчас ниже горизонтальной линии, 2 лишние левые строки тоже захватило.
Миниатюры
Создание регуляторки regex  
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
24.01.2017, 20:48
Vasiliyy, вам нужны ленивые выражения.
Попробуйте
C++
1
<text>((.|\\s)*?)</text>
https://regex101.com/r/DaQK47/1
0
4 / 3 / 6
Регистрация: 13.11.2015
Сообщений: 217
24.01.2017, 22:28  [ТС]
MrGluck, спасибо и за сайт, и за выражение, вроде бы все норм уже
Подскажите еще один момент пожалуйста, вот как m[1] переводить не в string fname, а в char fname? Если строка, которую разбирает regex, слишком большая - компилятор крашится. Нашел в инете функцию определения причины ошибки (ниже в спойлере прикреплю тоже) - пишет "there was not enough memory to perform a match". Скорее всего это из-за малого кол-ва оперативки моего компа, в том же инете пишут что длина string зависит от размера оперативной памяти.

Кликните здесь для просмотра всего текста
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
25
26
27
28
29
30
31
32
33
34
35
36
37
void descriptionRegexError(const std::regex_error& e)
{
    //std::cout << "regex_error caught: " << e.what() << '\n';
    //std::cout<< e.code() << '\n';
 
    if (e.code() == std::regex_constants::error_collate)
        std::cout << "the expression contains an invalid collating element name\n";
    else if (e.code() == std::regex_constants::error_ctype)
        std::cout << "the expression contains an invalid character class name\n";
    else if (e.code() == std::regex_constants::error_escape)
        std::cout << "the expression contains an invalid escaped character or a trailing escape\n";
    else if (e.code() == std::regex_constants::error_backref)
        std::cout << "the expression contains an invalid back reference\n";
    else if (e.code() == std::regex_constants::error_brack)
        std::cout << "the expression contains mismatched square brackets ('[' and ']')\n";
    else if (e.code() == std::regex_constants::error_paren)
        std::cout << "the expression contains mismatched parentheses ('(' and ')')\n";
    else if (e.code() == std::regex_constants::error_brace)
        std::cout << "the expression contains mismatched curly braces ('{' and '}')\n";
    else if (e.code() == std::regex_constants::error_badbrace)
        std::cout << "the expression contains an invalid range in a {} expression\n";
    else if (e.code() == std::regex_constants::error_space)
        std::cout << "there was not enough memory to convert the expression into a finite state machine\n";
    else if (e.code() == std::regex_constants::error_badrepeat)
        std::cout << "one of *?+{ was not preceded by a valid regular expression\n";
    else if (e.code() == std::regex_constants::error_complexity)
        std::cout << "the complexity of an attempted match exceeded a predefined level\n";
    else if (e.code() == std::regex_constants::error_stack)
        std::cout << "there was not enough memory to perform a match\n";
 
#ifdef _MSC_VER  //microsoft specific
    else if (e.code() == std::regex_constants::error_parse)
        std::cout << "error_parse\n";
    else if (e.code() == std::regex_constants::error_syntax)
        std::cout << "error_syntax\n";
#endif
}


Код со скрина:
Кликните здесь для просмотра всего текста
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
    try
    {
        std::regex regex_text("<text>((.|\\s)*?)<\/text>");// <text>(.|\s)*</text>
        std::smatch m;
        while (std::regex_search(r_text, m, regex_text))
        {// cout << m[1] << endl;
            r_text = m.suffix().str();
            std::string fname = m[1];
            for (int i = 0; i < sizeof NewsInfo; i++)
            {
                if (strlen(NI[i].text) == 0)
                {
                    strcat(NI[i].text, fname.c_str());// NI - это struct
                    cout << s1 << endl;
                    fout << NI[i].text << endl;
                    break;
                }
            }
        }
    }
    catch (const std::regex_error& e)
    {
        descriptionRegexError(e);
    }
Миниатюры
Создание регуляторки regex  
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
24.01.2017, 22:38
Цитата Сообщение от Vasiliyy Посмотреть сообщение
переводить не в string fname, а в char fname?
То есть брать не строку, а букву? И какую?

Добавлено через 1 минуту
Цитата Сообщение от Vasiliyy Посмотреть сообщение
while (std::regex_search
Если нужно перебрать строки, соответствующие регулярке, то используйте std::regex_iterator
0
4 / 3 / 6
Регистрация: 13.11.2015
Сообщений: 217
24.01.2017, 23:12  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
То есть брать не строку, а букву? И какую?
Хм, а как тогда вы посоветуете перевести этот smatch в string или в char, чтобы памяти хватило и не крашилась прога?

Добавлено через 17 секунд
Цитата Сообщение от MrGluck Посмотреть сообщение
То есть брать не строку, а букву? И какую?
Хм, а как тогда вы посоветуете перевести этот smatch в string или в char, чтобы памяти хватило и не крашилась прога?

Добавлено через 12 минут
Упс, 2 раза отправилось, только заметил)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.01.2017, 23:12
Помогаю со студенческими работами здесь

Regex
c:\windows\system\svhost.exe -&gt; svhost -&gt;.exe -&gt;windows c:\windows\svhost.exe -&gt;\

Regex
Почему не работает #include&lt;iostream&gt; #include&lt;cstdlib&gt; #include&lt;vector&gt; #include&lt;regex&gt; ...

Regex
Имееться файл, в нём написано : &quot;Мой мобильный номер 8095 - 123 - 45 - 67, телефон брата 8(066) - 7654321&quot;.Нужно исправить моб.номера...

Regex как проверить состав строки и ее длину
Написал? сверясь с гуглом? ракой регекс : &quot;/^{5,}+$/&quot; он будет работать? если нет, то как проверить состав строки + ее длину другим...

Regex
Добрый день. Имеется строка формата «слово1_слово2-цифра-слово3-цифра. Как можно разделить данные строку на компоненты: - слово1 ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru