首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用正则表达式从字符串中提取RFC1123主机名?

如何使用正则表达式从字符串中提取RFC1123主机名?
EN

Stack Overflow用户
提问于 2013-03-20 16:53:13
回答 1查看 577关注 0票数 1

我正在寻找一个正则表达式,它可以匹配字符串中任何可以是有效RFC1123主机名的内容,而字符串可以包含任何内容。这个想法是提取可能是主机名的所有内容(通过检查子字符串是否符合所有要求)-除了255个字符的最大长度之外,这很容易在之后检查结果。

我最初的想法是:

代码语言:javascript
复制
/(^|[^a-z0-9-])([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*)([^a-z0-9-]|$)/i

虽然这与括号中的表达式2中的一些主机名匹配(如预期的那样),但它似乎跳过了其他主机名。在堆栈溢出上查找问题,我发现了这个相关的问题:

Regular expression to match DNS hostname or IP Address?

从积极的反馈来看,答案应该是正确的(尽管它不能验证标签大小),所以我想我应该试一试。我将它们的表达式转换为类似于我之前的表达式的可提取格式:

代码语言:javascript
复制
/(^|[^a-z0-9-])((([a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9])\.)*([a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9]))([^a-z0-9-]|$)/i

同样,它应该在带括号的表达式2中返回所需的结果,但似乎跳过了一些有效的子字符串。我认为我检查不是主机名一部分的分隔符的方式可能有问题。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-20 21:47:05

我想通了。在扫描字符串的顺序匹配时,在所需表达式之前和之后都使用分隔符意味着每对主机名之间必须包含两个字符。因此,当主机名之间只有一个字符时,将跳过第二个字符!

要获得正确的结果,只需删除前导分隔符:

代码语言:javascript
复制
/([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*)([^a-z0-9-]|$)/i

它只需要验证,而不是扫描。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15518964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档