У меня есть следующий код, изначально запрограммированный с использованием библиотеки регулярных выражений C ++ 11 (#include <regex>
), но теперь использующий Boost для устранения неполадок:
boost::regex reg(R"(.*?((?:[a-z][a-z]+)).*?((?:[a-z][a-z]+)).*?((?:[a-z][a-z]*[0-9]+[a-z0-9]*)).*?((?:[a-z][a-z]+)).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z]+)).*?(\d+).*?((?:[a-z][a-z]+)))", boost::regex::icase);
boost::cmatch matches;
if (boost::regex_match(request, reg) && matches.size() > 1)
{
printf("Match found");
}
else
{
printf("No match.");
}
При выполнении этот код кажется "зависшим" на boost::regex_match(request, reg)
, как будто он занимает много времени для обработки. Я подождал пять минут для его обработки (в случае, если это проблема обработки), но состояние программы было таким же.
Я проверил версию вышеуказанного кода библиотеки STL regex
онлайн на cpp.sh и onlinegdb , и там он работает без нареканий. Затем я скопировал этот код в проект VC ++, и код снова зависает:
#include <iostream>
#include <string>
#include <regex>
int main()
{
std::string request = "\\login\\\\challenge\\jRJkdflp3gvTzrwiQ3tyKSqnyppmaZog\\uniquenick\\Lament\\partnerid\\0\\response\\4767846ef255a88da9b10f7c923a1e6e\\port\\-14798\\productid\\11489\\gamename\\crysiswars\\namespaceid\\56\\sdkrevision\\3\\id\\1\\final\\";
std::regex reg(R"(.*?((?:[a-z][a-z]+)).*?((?:[a-z][a-z]+)).*?((?:[a-z][a-z]*[0-9]+[a-z0-9]*)).*?((?:[a-z][a-z]+)).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z0-9_]*)).*?(\d+).*?((?:[a-z][a-z]+)).*?(\d+).*?((?:[a-z][a-z]+)))", std::regex::icase);
std::smatch matches;
if (std::regex_search(request, matches, reg) && matches.size() > 1)
{
printf("Match found");
}
else
{
printf("No match.");
}
}
Соответствующая строка:
\ Логин \ вызов \ jRJwdflp3gvTrrwiQ3tyKSqnyppmaZog \ uniquenick \ User \ Partnerid \ 0 \ ответ \ 4767846ef255a83da9b10f7f923a1e6e \ порт-14798 \ ProductID \ 11489 \ GameName \ crysiswars \ namespaceid \ 56 \ sdkrevision \ 3 \ идентификатор \ 1 \ окончательный \
Я протестировал тот же код на установке Visual Studio 2017 на другом компьютере (новый проект) и получил точно такой же результат ... который, кажется, указывает на то, что что-то, что делает компилятор, заставляет код зависать / принимать долгое время обработки. Я не могу проверить другой компилятор локально.
Строка регулярного выражения проверяет regex101 , поэтому функционально выражение в порядке.
Это для Visual Studio 2017 Professional с таргетингом v141.
Почему это происходит и как я могу это исправить?