Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
 Аватар для Ign0Rb
3 / 3 / 3
Регистрация: 04.07.2016
Сообщений: 64

RegExp C++

18.06.2017, 13:51. Показов 3145. Ответов 24

Студворк — интернет-сервис помощи студентам
Хочу использовать в программе регулярные выражения. Нашел в интернете PCRE (pcre.org) и обертку к нему - RegExp (github.com/YasserAsmi/regexp).

Для использования PCRE его нужно установить. Это можно как-то сделать на винде?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.06.2017, 13:51
Ответы с готовыми решениями:

Regexp для substr
Здравствуйте. можно ли прописать регулярное выражение для substr? типо такого: if (str.length() > 6 && str != '-'...

Std::regexp (ECMAScript) выхватить из строки ip
Собственно сабж. Написал такую штукенцию: std::string line2 = "192.168.1.5"; #define IP_OCTET "25|2]|1]{2}|]{1,2}" #define...

RegExp
А как обнулить коллекцию??? а то когда по новой ищеш match он добавляет к старым матчам!?!?!

24
23 / 23 / 6
Регистрация: 23.03.2013
Сообщений: 245
18.06.2017, 13:55
В с++ уже давно появился свой <regex>

не лучше ли использовать "родной" regex, ну или в крайнем случае свою "обертку" написать под него )
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.06.2017, 13:57
Лучший ответ Сообщение было отмечено Ign0Rb как решение

Решение

Цитата Сообщение от Ign0Rb Посмотреть сообщение
Это можно как-то сделать на винде?
http://www.cplusplus.com/reference/regex/


пример использования:

http://rextester.com/XEBV27745


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
38
39
40
41
42
43
44
45
#include <iostream>
#include <sstream>
#include <string>
#include <regex>
 
// вернет год рождения, либо пустую строку
std::wstring year(const std::wstring& from)
{
    std::wstring result;
    static std::wregex e(L"\\d*");
    std::wsregex_token_iterator i(from.begin(), from.end(), e);
    std::wsregex_token_iterator end;
 
    while (i != end)
        result += i->str(),
        ++i;
    return result;
}
 
 
int main ()
{
    setlocale(LC_ALL, "");
    
    std::wstringstream ws;
    ws << L"Иванов Петр Сергеевич 1975\n" 
       << L"Сидоров Николай Андреевич 1981\n"
       << L"Воробьянинов Ипполит Матвеевич 1978\n"
       << L"Воробьянинов Ипполит Матвеевич\n"
       << L"fВоробьянинов Ипполит Матвеевич 19783456\n"
       << L"Сидоров Николай ШкололоАндреевич 2001"
    ;
    
    std::wstring y;
    std::wstring line;
    while (std::getline(ws, line)) 
        if( (y = year(line)).empty())
            std::wcout << L"[отклонено] '" << line << L"' : отсутствует год рождения\n";
        else if(y.length()!=4)
            std::wcout << L"[отклонено] '" << line << L"' : некорректный год рождения\n";
        else if( std::stoul(y) <= 1980 )
            std::wcout << L"[отклонено] '" << line << L"' : слишком старый\n";
        else
            std::wcout << L"[ принято ] '" << line << L"'\n";
}
0
2 / 2 / 0
Регистрация: 09.08.2015
Сообщений: 181
17.04.2019, 19:13
Всем здравствуйте.

Пожалуйста, помогите

Есть текстовая переменная text , которая, для примера, может быть

Code
1
2
3
Тест | 0+
Тест | Тест | 0+
Тест | 0+ Тест | 0+
Пожалуйста, напишите, чем проще тем лучше, при помощи regexp , стандартными средствами, библиотеками, по примеру, как сделано здесь, как с конца строки убрать приписку
| 0+
| 6+
| 12+
| 16+
| 18+

То есть меняются только цифры
0
6
12
16
18

И желательно проверить пример, мол, как здесь http://rextester.com/XEBV27745

На выходе, для примера выше, должно быть так

Code
1
2
3
Тест
Тест | Тест
Тест | 0+ Тест
Спасибо.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.04.2019, 19:38
SharkyEXE,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
#include <vector>
#include <regex>
#include <algorithm>
 
int main()
{
    std::vector<std::string> text{
        "Тест | 0+",
        "Тест | Тест | 0 +",
        "Тест | 0 + Тест | 0 +" };
 
    std::regex rgx{ "\\s*\\|\\s*\\d+\\s*\\+\\s*$" };
    std::for_each(text.begin(), text.end(), [&](const auto& str)
    {
        std::smatch sub;
        if (std::regex_search(str, sub, rgx))
            std::cout << sub.prefix() << std::endl;
    });
}
1
2 / 2 / 0
Регистрация: 09.08.2015
Сообщений: 181
17.04.2019, 19:51
zayats80888

Здравствуйте.

Большое Вам спасибо за поомщь, работает

А еще проще никак нельзя, мол в одну строку?

Мне вот тут решение предложили, типа так
Code
1
2
3
4
#include <string>
#include <regex>
std::regex rgx("\| \d+\+$");
text = std::regex_replace(text, rgx, "", std::regex_constants::format_first_only);
Где text - это строковая переменная, которая может быть, для примера
Code
1
2
3
Тест | 0+
Тест | Тест | 0 +
Тест | 0 + Тест | 0 +
Как бы минумум кода, только я не могу проверить, работает или нет?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.04.2019, 20:00
Цитата Сообщение от SharkyEXE Посмотреть сообщение
только я не могу проверить
И что вам мешает проверить?
0
2 / 2 / 0
Регистрация: 09.08.2015
Сообщений: 181
17.04.2019, 20:02
zayats80888

Здравствуйте.

Просто скопировать-вставить работать не будет

Пожалуйста, помогите, облагородите код, что я привел, чтобы заработало на компиляторе, к примеру, здесь https://rextester.com
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.04.2019, 20:06
SharkyEXE,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <string>
#include <regex>
 
int main()
{
    std::string text{ "Тест | 0+\nТест | Тест | 0 +\nТест | 0 + Тест | 0 +" };
    std::cout << "\nbefore:\n" << text << std::endl;
 
    std::regex rgx{ "\\s*\\|\\s*\\d+\\s*\\+\\s*$" };
    text = std::regex_replace(text, rgx, "");
 
    std::cout << "\nafter:\n" << text << std::endl;
}
1
2 / 2 / 0
Регистрация: 09.08.2015
Сообщений: 181
17.04.2019, 20:16
zayats80888

Здравствуйте.

Большое Вам спасибо, работает

Еще пожелание - я Вас очнеь прошу, сделайте, так сказать, чтобы вслепую работало, чтобы бралась переменная text, обрабатывалась и на выходе переменная text была обработанная

То есть в компиляторе https://rextester.com ничего не будет выводиться, зато на выходе, когда в переменную text будут поступать строки, на выходе переменная text будет отдавать обработанную строку

То есть чтобы так, только чтобы 100%но работало
Code
1
2
3
4
5
6
7
8
#include <string>
#include <regex>
 
int main()
{
    std::regex rgx{ "\\s*\\|\\s*\\d+\\s*\\+\\s*$" };
    text = std::regex_replace(text, rgx, "");
}
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.04.2019, 20:22
SharkyEXE, Вы как-то туманно изъясняетесь, вам функция с сигнатурой void foo(std::string&); что ли нужна?
0
2 / 2 / 0
Регистрация: 09.08.2015
Сообщений: 181
17.04.2019, 20:28
zayats80888

Здравствуйте.

Есть файл - прилагаю.

После строки ( 793 номер )
Code
1
text = evt->getEventName();
нужно вставить типа такого
Code
1
2
std::regex rgx{ "\\s*\\|\\s*\\d+\\s*\\+\\s*$" };
text = std::regex_replace(text, rgx, "");
Чтобы на выходе переменная text будет такая
Тест
Тест | Тест
Тест | 0 + Тест
Вложения
Тип файла: zip listboxservice.cpp.zip (31.6 Кб, 3 просмотров)
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.04.2019, 20:34
Цитата Сообщение от SharkyEXE Посмотреть сообщение
нужно вставить типа такого
ну так и вставьте, в чем проблема?
0
2 / 2 / 0
Регистрация: 09.08.2015
Сообщений: 181
17.04.2019, 20:35
zayats80888

Здравствуйте.

Пожалуйста, я Вас очень прошу, поправьте и выложите исправленынй файл

Почему?

Вы поправите правильно, чтобы работало, я могу накосячить, потому что особо не силен...
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.04.2019, 20:53
Цитата Сообщение от SharkyEXE Посмотреть сообщение
я могу накосячить
Просто вставьте эти две строчки после 793 строки, я сделаю то же самое, только у меня нет возможности проверить, а у вас есть. Если не будет работать как вам надо, просто удалите их.

Добавлено через 3 минуты
и не забудьте #include <regex> добавить
0
2 / 2 / 0
Регистрация: 09.08.2015
Сообщений: 181
17.04.2019, 20:53
zayats80888

Здравствуйте.

То есть будет так?

text = evt->getEventName();
std::regex rgx{ "\\s*\\|\\s*\\d+\\s*\\+\\s*$" };
text = std::regex_replace(text, rgx, "");

Вопросы:
1) скобки в строке
Code
1
std::regex rgx
какие использовать
{}
или
()
?
2) использовать в строке
Code
1
std::regex rgx
двойные \\
или
одинарные \
?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.04.2019, 20:55
Цитата Сообщение от SharkyEXE Посмотреть сообщение
То есть будет так?
Если в VS2017 собираете то да
0
2 / 2 / 0
Регистрация: 09.08.2015
Сообщений: 181
17.04.2019, 20:59
zayats80888

Здравствуйте.

У меня собирается бинарник, который будет работать на Linux

Есть или нет особенности кода?

По крайней мере, я прошу Вас, скачайте файл, что я приложил, по его синтаксису, структуре, Вы может быть точно скажите, какие скобки использовать, одинарные или двойные \\

Спасибо.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
17.04.2019, 21:11
SharkyEXE, я сам не программист, только изучаю язык. Пробуйте, экспериментируйте, тестируйте.
Цитата Сообщение от SharkyEXE Посмотреть сообщение
одинарные или двойные \\
Для преобразования строкового литерала в регулярное выражение, в первом должны дублироваться \, т. е.
Code
1
2
\s*\|\s*\d+\s*\+\s*$            //регулярное выражение
 "\\s*\\|\\s*\\d+\\s*\\+\\s*$" //строковый литерал, его представляющий
0
2 / 2 / 0
Регистрация: 09.08.2015
Сообщений: 181
17.04.2019, 21:17
zayats80888

Здравствуйте.

А по поводу скобок?

1) скобки в строке
Code
1
std::regex rgx
какие использовать
{}
или
()
?

PS. Без обид и прочего, как бы проверить смогу через 6-7 часов, не ранее, верите или нет - так долго будет собираться бинарник-исполняемый файл...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.04.2019, 21:17
Помогаю со студенческими работами здесь

REGEXP
Здравствуйте. Имеется таблица customers (содержимое на скриншоте). Далее делаю запрос SELECT cust_contact FROM customers WHERE...

Regexp
Доброго всем вечера! Не могли бы вы подсказать как построить регулярное выражение для парсинга арифметических формул? (Например, 4+5 или...

RegExp
Добрый день всем ! Не могу ни как разбраться с одной задачкой на тему RegExp нужно буквально написать 4-5 строки кода типа ^\d+$...

regexp
Почему это не работает? $ma=&quot;ghghhfhfhfhfhfhfghfhh111sdfsdd11111&quot;; echo $ma; preg_match('/^(?&lt;=ghghh)*+$/', $ma, $match); echo...

RegExp
Добрый день ! есть вот эти четыре строки Нужно написать RegExp код корый бы выводил, dec hex oct bin 1347 0x80 013 101b


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru