Цель регулярного выражения — взять строку и составить список всех имен хостов, но взять только 3 точки справа от нее.
Это работает, но можно увидеть, что скрипт выбирает левое имя хоста, а не правое.
Regex
((([a-zA-Z0-9]{1,63}|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])\.){1,3}[a-zA-Z]{2,63})
Сейчас
site.com 1.site.com 2.1.site.com 3.2.1.site.ком 4.3.2.1.site.com 5.4.3.2.1.site.com
Исправлена
site.com 1.site.com 2.1.site.com 3.2.1.site.com 4,3.2.1.site.com 5.4.3.2.1.site.com
Если вы хотите использовать свое регулярное выражение для этого, вам нужно ограничить +
просто {0,3}
случаи, и использовать \b
граница слова (?!\.)
загляните в конец, чтобы убедиться, что мы сопоставляем строки на завершающей границе слова, и после нее не должно быть точки:
(([a-zA-Z0-9]{1,63}|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])\.){0,3}[a-zA-Z]{2,63}\b(?!\.)
^^^^^ ^^^^^^^^
Увидеть regex demo
Обратите внимание, что +
квантификатор соответствует 1 или более экземпляров квантифицированного подшаблона и {0,3}
ограничения (связанный) квантификатор позволяет сопоставлять только 3 вхождения.
В C ++ вы можете использовать необработанный строковый литерал (R"(<PATTERN>)"
) чтобы определить регулярное выражение, чтобы избежать перегрузки:
std::regex rx(R"((([a-zA-Z0-9]{1,63}|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])\.){0,3}[a-zA-Z]{2,63}\b(?!\.))");
Других решений пока нет …