Форум программистов, компьютерный форум CyberForum.ru

Исправить регулярку, чтобы в rgxm записывалось последовательно логин, пароль, адрес сервера, порт и имя потока - C++

Восстановить пароль Регистрация
 
Khelleos
37 / 37 / 7
Регистрация: 13.05.2010
Сообщений: 283
Записей в блоге: 1
20.04.2014, 20:23     Исправить регулярку, чтобы в rgxm записывалось последовательно логин, пароль, адрес сервера, порт и имя потока #1
Пытаюсь распарсить выражение такого вида "rtsp://[<username>[:<password>]@]<server-address-or-name>[:<port>][/<stream-name>]"

C
1
result = std::regex_match(url, rgxm, std::regex("rtsp://(\\w*):*(\\w*)@*([a-zA-Z0-9.]*):*(\\d*)([/a-zA-Z0-9_.]*)"));
Но если отсутсвует логин и пароль, то не верно определяется адрес сервера (ip-address) (первые цифры идут в логин, пароль пустой и соотвестнно адрес не верно определен)
Как можно исправить регулярку, чтобы в rgxm записывалось последовательно логин, пароль, адрес сервера, порт и имя потока?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2014, 20:23     Исправить регулярку, чтобы в rgxm записывалось последовательно логин, пароль, адрес сервера, порт и имя потока
Посмотрите здесь:

Нужно что бы пароль и имя записывались в файл, как исправить? C++
C++ C++ Проверка логин\пароль
Как сделать чтобы в файл записывалось все на русском? C++
подкорректировать код(логин и пароль) C++
Логин и пароль прочитать из файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4302 / 3723 / 1255
Регистрация: 14.04.2014
Сообщений: 14,563
20.04.2014, 21:48     Исправить регулярку, чтобы в rgxm записывалось последовательно логин, пароль, адрес сервера, порт и имя потока #2
Там надо с условиями.
Khelleos
37 / 37 / 7
Регистрация: 13.05.2010
Сообщений: 283
Записей в блоге: 1
20.04.2014, 22:12  [ТС]     Исправить регулярку, чтобы в rgxm записывалось последовательно логин, пароль, адрес сервера, порт и имя потока #3
Сделал так пока-что
C++
1
2
3
4
5
6
7
    result = std::regex_match(cUrl, rgxm, std::regex("rtsp://((\\w*)(:(\\w*))?@)?(([0-9.]*)(:([0-9]*))?)([a-zA-Z0-9./]*)?"));
 
    printf("username   = %s\n", rgxm[2].str().c_str());
    printf("password   = %s\n", rgxm[4].str().c_str());
    printf("ip address = %s\n", rgxm[6].str().c_str());
    printf("port       = %s\n", rgxm[8].str().c_str());
    printf("stream     = %s\n", rgxm[9].str().c_str());
Либо отказаться от регулярки и парсить ручками, либо выделять регуляркой "логин:пароль@", "адресс:порт", "/имя потока". А потом уже парсить логин-пароль, адресс-порт.
nmcf
4302 / 3723 / 1255
Регистрация: 14.04.2014
Сообщений: 14,563
20.04.2014, 22:18     Исправить регулярку, чтобы в rgxm записывалось последовательно логин, пароль, адрес сервера, порт и имя потока #4
Сделай 2 шаблона с именем и паролем и без них. Применяй в зависимости от присутствия символа @ в строке.
KOPOJI
Модератор
 Аватар для KOPOJI
16242 / 6453 / 390
Регистрация: 12.06.2012
Сообщений: 19,347
20.04.2014, 23:05     Исправить регулярку, чтобы в rgxm записывалось последовательно логин, пароль, адрес сервера, порт и имя потока #5
Заморачиваться с реализацией регулярок в плюсах не особо хочется, но сама регулярка может выглядеть как-то так
C++
1
"/rtsp:\\/\\/(?P<username>.+?(?=[:@]))?(?::(?P<password>.+?(?=@))@)?(?P<server>[-_a-z]+|(?:\\d{1,3}\\.){4})(?::(?P<port>.+?(?=\\/|\\Z)))?(?:\\/(?P<stream>[-_a-z]+))?/i"
В пыхе это выглядит так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php header('Content-type: text/html;charset=utf-8'); 
 
$text = 'rtsp://foo:bar@localhost:3000/lol';
 
$regexp = '~rtsp://(?P<username>.+?(?=[:@]))?
(?::(?P<password>.+?(?=@))@)?
(?P<server>[-_a-z]+|(?:\\d{1,3}\\.){4})
(?::(?P<port>.+?(?=/|\\Z)))?
(?:/(?P<stream>[-_a-z]+))?~ix';
 
if(preg_match($regexp, $text, $matches))
    foreach($matches as $key => $val)
        if(is_string($key))
            echo $key, ' => ', $val, PHP_EOL;
Исправить регулярку, чтобы в rgxm записывалось последовательно логин, пароль, адрес сервера, порт и имя потока
Yandex
Объявления
20.04.2014, 23:05     Исправить регулярку, чтобы в rgxm записывалось последовательно логин, пароль, адрес сервера, порт и имя потока
Ответ Создать тему
Опции темы

Текущее время: 21:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru