如何用正则表达式从含多内容字符串的FQDN中提取主机名?
解决方案
要匹配两种格式行中的主机名(FQDN的第一个点前部分),可以从定位FQDN再提取主机名的思路入手,以下是两种可靠的实现方式:
方式一:单正则直接捕获目标
使用这个正则表达式:
\b(\w+)\.(?:[\w-]+\.)+[\w-]+\b
- 原理:
\b是单词边界,确保匹配完整的FQDN;(\w+)捕获主机名(由字母数字下划线组成);(?:[\w-]+\.)+[\w-]+匹配FQDN剩余的域名部分(非捕获组,避免干扰结果)。 - 用法:对每行文本执行匹配,取第一个捕获组的内容即可。比如:
- 第一行匹配到完整FQDN
apl22002.prod.f02.dc2.example.com,捕获组1是apl22002 - 第二行匹配到完整FQDN
apl220010.prod.f02.dc2.example.com,捕获组1是apl220010
- 第一行匹配到完整FQDN
方式二:分场景匹配(更直观)
如果想针对两种行格式分别处理,也可以用包含两个分支的正则:
^(?:(\w+)\..*|.*-\s*(\w+)\..*)
- 原理:
^(\w+)\..*匹配开头是FQDN的行,捕获组1为开头的主机名.*-\s*(\w+)\..*匹配-后是FQDN的行,捕获组2为FQDN的主机名
- 用法:执行匹配后,取非空的捕获组内容(要么组1有值,要么组2有值)。
补充说明
如果你的主机名包含连字符-,可以把正则里的\w+改成[\w-]+,比如\b([\w-]+)\.(?:[\w-]+\.)+[\w-]+\b,适配带连字符的主机名。
内容的提问来源于stack exchange,提问作者Celavier
相关产品推荐
相关产品推荐

