Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2016, 01:03   #1
Xo66um
Форумчанин
 
Регистрация: 11.05.2013
Сообщений: 154
По умолчанию Регулярное выражение

Всем привет.
Давно уже мучаюсь с этой проблемой, и никак не могу найти ответа, поэтому прошу помощи у вас.
Собственно, есть некий URL (любой), из которого необходимо получить только доменное имя, отсекая все лишнее. И есть регулярное выражение, которое, по идее, должно это делать:
Код:
(?:https?:\/\/)?([\\w\.\-]+)\/?
Проблема в том, что если этой регулярке подсунуть URL, типа:
Код:
http://some.domain.name/and/param/99/
То ничего не найдется, но если сунуть
Код:
http://some.domain.name/
То на выходе получим:
Код:
some.domain.name/
(Именно со слешем на конце, хотя в регулярке он не включен в группу)

Но если написать регулярку таким образом:
Код:
(?:https?:\/\/)?([\\w\.\-]+)\/?.*
Получим:
Код:
some.domain.name/and/param/99/
Чего вообще быть не должно, ведь последнее не заключено в группу (опять же).

Продолжаем тест.
Пишем регулярное выражение:
Код:
(?:https?:\/\/)?([\\w\.\-]+)\/?(.*)
Получаем результат:
Код:
1: some.domain.name/and/param/99/
2: and/param/99/
То есть, в первом вхождении строка снова выводится сначала (начиная с http), а во втором - все, начиная с со слеша, идущего после домена.

Этому всему есть какое-то логическое объяснение? И как все-таки написать регулярку с использованием regex (не прибегая к Boost, и не шаманя с регулярками Perl)?
Xo66um вне форума Ответить с цитированием
Старый 11.05.2016, 23:35   #2
Xo66um
Форумчанин
 
Регистрация: 11.05.2013
Сообщений: 154
По умолчанию

Проблема все еще актуальна. Может хоть какие-то мысли есть по этому поводу?
Xo66um вне форума Ответить с цитированием
Старый 12.05.2016, 00:02   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

1) Покажите код.
2) Не могу понять, что значит "?:" в самом начале регулярки.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 12.05.2016, 00:21   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

игнорируемая группа.

я попробую после поразбирать, а разве в С++ нет готового Uri парсера(ну библиотеки)?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.05.2016, 02:07   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
я попробую после поразбирать, а разве в С++ нет готового Uri парсера(ну библиотеки)?
URL-парсер. Ури-Ури, ты нашёл у него кнопку?
Вообще-то в Си регулярки не пишутся. Не для того он предназначен, хотя, в принципе и можно. Но лучше писать их на PHP. Апачь "сам знает" как обработать символы регулярки. Будешь писать на Си, придётся встраивать библиотеки Апуч-а. Как минимум три. И не факт, что они будут работать на всех компах.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 12.05.2016, 03:22   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
URL-парсер. Ури-Ури, ты нашёл у него кнопку?
Вообще-то в Си регулярки не пишутся. Не для того он предназначен, хотя, в принципе и можно. Но лучше писать их на PHP. Апачь "сам знает" как обработать символы регулярки. Будешь писать на Си, придётся встраивать библиотеки Апуч-а. Как минимум три. И не факт, что они будут работать на всех компах.
выйдите из каменного века, ранее регулярки были доступны из буста.
сейчас приняты в стандарт std::regex.

ну и про Uri
https://ru.wikipedia.org/wiki/URI

да и для справки движок регулярок для PHP это обычно pcre, который написан на С.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 12.05.2016 в 03:35.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.05.2016, 03:37   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
выйдите из каменного века
Да, сложновато уже из него выходить . Когда входил, было всё в радужных цветах. Сейчас, почему-то, всё в чёрно-белую полосочку больше.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 12.05.2016, 05:29   #8
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 671
По умолчанию

Регулярки в std c++ сырые (как там в boost не знаю), ковырял как-то. Интересно то, что криво (на мой взгляд) работает и egrep у меня на линуксе
Код:
echo "http://some.domain.name/and/param/99/" | egrep '(https?:\/\/)?([^\/]*)'
совпадает со всем адресом целиком, если убрать ? между группами, то до / (как и задумывалось).
220Volt вне форума Ответить с цитированием
Старый 12.05.2016, 07:22   #9
Xo66um
Форумчанин
 
Регистрация: 11.05.2013
Сообщений: 154
По умолчанию

Код функции:
Код:
bool getDomain(LPSTR lpURL) {
	std::regex RegExp("(?:https?:\/\/)?([\\w\.\-]+)\/?");
	std::cmatch Result;

	bool bResult = std::regex_match(lpURL, Result, RegExp);

        char szBuffer[255] = { 0 };
	for (int i = 0; i < Result.size(); i++) {
		wsprintf(szBuffer, "%d: %s", i, Result[i]);
		Memo_AddLine(Memo1, szBuffer);
	}

	return bResult;
}
Про готовый Uri парсер не знаю (только осваиваю C++, по большому счету). Но вообще, насколько я знаю, можно переписать это дело на Perl регулярках, или подключить бибиотеки Boost, но хотелось-бы разобраться и работать именно с std::regex, т.к. не особо хочется тянуть за собой лишние библиотеки.
Xo66um вне форума Ответить с цитированием
Старый 12.05.2016, 07:51   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

бустовский регекс как раз и перекочевал в стандарт.(точнее его часть, вроде как)

Цитата:
Регулярки в std c++ сырые (как там в boost не знаю), ковырял как-то. Интересно то, что криво (на мой взгляд) работает и egrep у меня на линуксе
а может все же регулярка неверная?

попробуйте так.
http://ideone.com/zHf7e4
.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 12.05.2016 в 08:20.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регулярное выражение sanek_da Помощь студентам 0 23.11.2013 17:17
Регулярное выражение D_E_N Общие вопросы Delphi 5 19.11.2013 17:31
Регулярное выражение xlebobulka Microsoft Office Excel 5 02.08.2013 18:32
регулярное выражение Mortimoro JavaScript, Ajax 3 22.06.2013 09:16
Регулярное выражение kpachbiu PHP 2 08.02.2011 21:36