正则表达式匹配域与 3 个点

Regex to match domains with 3 dots

正则表达式的目的是获取一个字符串并列出所有主机名,但只获取其中右边的 3 个点。

有效,但可能会看到脚本 select 位于主机名的左侧,而不是右侧。

正则表达式

((([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.com 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} limiting(绑定)量词仅允许匹配 o 到 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(?!\.))");