При разработке моей личной библиотеки я наткнулся на то, что, по моему мнению, является ошибкой внутри libstdC++ 6.Подтверждение ошибки
Потому что я уверен, что эта библиотека была рассмотрена многими людьми с гораздо более высоким уровнем квалификации, чем я. Я пришел сюда, чтобы подтвердить мои выводы и получить помощь в дальнейших шагах.
Рассмотрим следующий код:
#include <regex>
#include <iostream>
int main()
{
std::string uri = "http://example.com/test.html";
std::regex reg(...);
std::smatch match;
std::regex_match(uri, match, reg);
for(auto& e: match)
{
std::cout<<e.str() <<std::endl;
}
}
Я написал регулярное выражение для разбора URL в
- протокола
- пользователя/Pass (по желанию)
- Хост
- Порт (опционально)
- Путь (по желанию)
- запрос (необязательно)
- Местонахождение (факультативно)
Я использовал следующее регулярное выражение (в C++):
std::regex reg("^(.+):\\/\\/([email protected])?([a-zA-Z\\.\\-0-9]+)(:\\d{1,5})?([^?\\n\\#]*)(\\?[^#\\n]*)?(\\#.*)?$");
Это работало довольно хорошо в онлайн-тестером и MSVC++ 2015 Update 3 но сбой на моем хосте сборки, где хост-часть соответствует хосту и пути.
Buildhost:
г ++ (Ubuntu 5.4.0-6ubuntu1 ~ 16.04.2) 5.4.0 20160609
libstdC++ 6: amd64 5.4.0-6ubuntu1 ~ 16.04.2
Я считаю, что это ошибка, потому что, если изменить регулярное выражение для этого:
std::regex reg("^(.+):\\/\\/([email protected])?([a-zA-Z\\.0-9\\-]+)(:\\d{1,5})?([^?\\n\\#]*)(\\?[^#\\n]*)?(\\#.*)?$");
Он отлично работает хотя он должен вести себя точно так же.
В противном случае регулярное выражение: https://ideone.com/7n2JdK
Работа регулярных выражений: https://ideone.com/6NMPUW
ли я пропустить что-то очень важное здесь, или это ошибка в libstdC++ 6?
Единственное отличие состоит в классе полукокса:
[a-zA-Z\\.\\-0-9] // not working
[a-zA-Z\\.0-9\\-] // working
Возможно, вы хотели бы указать на разницу между двумя регулярными выражениями, или вы ожидаете, что каждый сможет их сравнить, персонаж? –
Нет необходимости проверять символ char. Это явно ошибка. –