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

Написать регулярное выражение для поиска строки

08.10.2016, 13:01. Показов 5733. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Изучаю регулярные выражения. Столкнулся с проблемой.
Как написать рег выр для поиска строки "port=1234" или " port = 1234" пробелов может быть любое количество.
Написал следующее:
C++
1
const regex rx("\s*port\s*=\s*\d+");
Не нашёл ни одного совпадения.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.10.2016, 13:01
Ответы с готовыми решениями:

Написать регулярное выражение для поиска слов заканчивающихся на –ing
Необходимо написать регулярное выражение для поиска слов заканчивающихся на –ing и имеющие в первой части слова хотя бы одну гласную. Вот...

Вырезать символ из строки, регулярное выражение
Подскажите пожалуйста как из строки std::string s = "string\.txt"; вырезать сиивол "\"

Объединить две строки и подправить регулярное выражение
В общем задача на уровне для новичка, но я ее резко не осилила. Может еще сама соображу, но вчера ночью не справилась. static const...

13
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
08.10.2016, 13:23
Ты черту удваиваешь?
C++
1
"\\s"
0
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
08.10.2016, 13:30  [ТС]
нет

Добавлено через 32 секунды
Вот блин. Спасибо.

Добавлено через 1 минуту
А как написать регулярку для извлечения 1234 из "port=1234" ?

Добавлено через 3 минуты
или же правильно сказать как извлечь 1234 с помощью регулярки?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.10.2016, 13:36
http://rextester.com/WNS42828

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
#include <iostream>
#include <string>
#include <regex>
 
 
// Как написать рег выр для поиска строки "port=1234" или " port = 1234" 
// Пробелов может быть любое количество.
 
void example(const std::string& src)
{
    static std::regex reg("^\\s*port\\s*=\\s*\\d*\\s*$"); 
    
    std::cout << "проверяю... '"<<src<<"' ---> ";
    
    if(regex_match(src, reg))
        std::cout <<"подходит!";
    else
        std::cout <<"отклоненно!";
    std::cout << std::endl;
}
 
 
int main ()
{
    example("port=1234"      );
    example("port = 1234"    );
    example("  port = 1234  ");
    example("  port= 1234  " );
    
    example("por=1234"       );
    example("port=1234asd"   );
}
1
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
08.10.2016, 13:40  [ТС]
Спасибо за ответ. Как извлечь 1234 с помощью регулярки ?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.10.2016, 13:40
Цитата Сообщение от Abraziv__ Посмотреть сообщение
или же правильно сказать как извлечь 1234 с помощью регулярки?
http://rextester.com/TPX53368
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
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <string>
#include <regex>
 
 
// Как написать рег выр для поиска строки "port=1234" или " port = 1234" 
// Пробелов может быть любое количество.
// И извлечь цыфры
 
 
void find_digit(const std::string& line)
{
    // допускает запись вида:  +1 или -1 или 1
    // если +- не интересен - регулярку придется переписать
    static std::regex e("(\\+|-)?[[:digit:]]+");
    
    std::sregex_token_iterator i(line.begin(), line.end(), e);
    std::sregex_token_iterator end;
    
    std::string result;
    while (i != end)
        result += i->str() + " ",
        ++i;
    
    if(!result.empty())
        result.pop_back();
    
    std::cout << " : извлеченное число = '" << result << "'";
}
 
 
void example(const std::string& src)
{
    static std::regex reg("^\\s*port\\s*=\\s*\\d*\\s*$"); 
    
    std::cout << "проверяю... '"<<src<<"' ---> ";
    
    if(regex_match(src, reg))
        std::cout <<"подходит!",
        find_digit(src);
    else
        std::cout <<"отклоненно!";
    std::cout << std::endl;
}
 
 
int main ()
{
    example("port=1234"      );
    example("port = 1234"    );
    example("  port = 1234  ");
    example("  port= 1234  " );
    
    example("por=1234"       );
    example("port=1234asd"   );
}
0
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
08.10.2016, 13:41  [ТС]
hoggy
Ничёсе скорость у вас.
0
Заблокирован
08.10.2016, 14:52
C++
1
2
3
4
5
6
7
8
9
 string init = "port=1234 или Dsdsd   port   = 1222";
 
    regex rgx(R"(port\s*=\s*[0-9]{1,4})");
    match_results<string::const_iterator> result;
    string::const_iterator iter = init.cbegin();
    while (std::regex_search(iter, init.cend(), result, rgx)) {
        cout << result.str(0) << endl;
        std::advance(iter, result.position(0) + result.length(0));
    }
Добавлено через 15 минут
Цитата Сообщение от Abraziv__ Посмотреть сообщение
как извлечь 1234 с помощью регулярки?
C++
1
2
3
4
5
6
7
8
9
10
 string init = "port=1234 или Dsdsd   port   = 1222";
 
    sregex_token_iterator s;
    regex rgx(R"(port\s*=\s*([0-9]{1,4}))");
    match_results<string::const_iterator> result;
    string::const_iterator iter = init.cbegin();
    while (std::regex_search(iter, init.cend(), result, rgx)) {
        cout << result.str(1) << endl;
        std::advance(iter, result.position(0) + result.length(0));
    }
1
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
08.10.2016, 15:58  [ТС]
Всем спасибо.

Добавлено через 1 час 4 минуты
А зачем нужно это (\\+|-)? в static std::regex e("(\\+|-)?[[:digit:]]+");
и зачем [[:digit:]] вместо \\d
???
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
08.10.2016, 18:17
Плюс экранируется, потому что это спец. символ. А [[:digit:]], просто другой вариант \\d.
0
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
08.10.2016, 18:21  [ТС]
Это понятно. А зачем там + или - ?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
08.10.2016, 18:29
Цитата Сообщение от Abraziv__ Посмотреть сообщение
Это понятно. А зачем там + или - ?
Цитата Сообщение от hoggy Посмотреть сообщение
C++
1
2
// допускает запись вида: +1 или -1 или 1
// если +- не интересен - регулярку придется переписать
Комментарии-то для Вас были сделаны.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.10.2016, 18:30
Цитата Сообщение от Abraziv__ Посмотреть сообщение
А зачем нужно это (\\+|-)?
для вашей задачи это не нужно.
но вообще числа могут быть так же отрицательными (содержать знак '-'),
так и явно положительными (содержать знак '+').

http://rextester.com/LROM95768
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
46
#include <iostream>
#include <string>
#include <regex>
 
//выкавыривает из строки число
//число может быть:
//   обычным
//   явно положительным
//   явно отрицательным
void find_digit(const std::string& line)
{
    static std::regex e("(\\+|-)?[[:digit:]]+");
    
    std::sregex_token_iterator i(line.begin(), line.end(), e);
    std::sregex_token_iterator end;
    
    std::string result;
    while (i != end)
        result += i->str() + " ",
        ++i;
    
    std::cout <<"из строки '"<<line <<"'";
    
    if(result.empty())
        return std::cout <<" не удалось извлечь число...\n", 
        void();
    
    result.pop_back();
 
    std::cout << " извлеченно число '" << result << "', оно - ";
    if(result.front()=='+')
        std::cout <<"явно положительное\n";
    else if(result.front()=='-')
        std::cout <<"явно отрицательное\n";
    else
        std::cout <<"не содержит знаков +-\n";
}
 
 
int main ()
{
    find_digit("sfds");
    find_digit("dsfsdf12344");
    find_digit("dsfsdf+657765");
    find_digit("dsfsdf-435645");
}
можно ещё поддержку дробных чисел добавить.
или даже поддержку различных форматов записей с экспонентой и тп.
но вам это точно не нужно, а мне - как то влом.
0
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
08.10.2016, 18:40  [ТС]
Понял, спасибо. Я просто не сразу понял зачем для поставленной задачи + или -. Комменты не читал))))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.10.2016, 18:40
Помогаю со студенческими работами здесь

Составить регулярное выражение, пропускающее строки, являющиеся целыми числами в заданном диапазоне
Ребя помогите пожалуйста. Я ничего не понимаю из того что ниже написано, а лабораторную по теории автоматов сдать надо! Для каждого из...

Регулярное выражение для многострочного комментария
Помогите сделать регулярное выражение для многострочного комментария. Вот пример svmbuf = &quot;bla /* bla \n bla */ bla&quot;; ...

Регулярное выражение для выбора email
написать программу, используя регулярное выражения, которая с текста выбирает и выводит только электронные адреса. объясните пожалуйста...

Составить регулярное выражение для строкового образца
Добрый день. Только начал осваивать регулярные выражение и не могу разобраться. Есть такие строки: Israel Weapon Industries ...

Регулярное выражение для подсчета числа скобок
Допустим, есть регекс вида const std::regex reg(R&quot;(\(.+.*?\).+)&quot;); Можно заставить его считать скобки? Т.е чтобы открывающихся было...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru