【问题标题】:Regex match a hostname -- not including the TLD正则表达式匹配主机名——不包括 TLD
【发布时间】:2010-10-24 14:32:21
【问题描述】:

我需要匹配一个主机名——但不想要 tld:

example.com =~ /regex/ => 示例

sub.example.com =~ /regex/ => sub.example

sub.sub.example.com =~ /regex/ => sub.sub.example

对正则表达式有帮助吗?谢谢。

【问题讨论】:

  • 那么 sub.example.co.nz 呢?

标签: regex hostname


【解决方案1】:

假设您的字符串格式正确并且不包含协议之类的内容 [即http://],您需要所有字符,但不包括最终的 .tld。

所以这是最简单的方法。正则表达式的诀窍是不要让事情变得过于复杂:

.*(?=\.\w+)

这基本上是说,给我[例如] .xxx 后面的集合中的所有字符,这基本上只会返回最后一个句点之前的所有内容.

如果您没有前瞻功能,它可能最容易使用:

(\w+\.)+

这将为您提供所有内容,包括最后的“。”然后修剪'.'。

【讨论】:

  • 老鼠,我花了很长时间。你是第一个。好的正则表达式;)(如果你有积极的前瞻)
  • 提防“.co.uk”或“.com.au”等非常常见的顶级域名。
【解决方案2】:

试试这个

/.+(?=\.\w+$)/

如果不支持 ?= 它会是

/(.+)\.\w+$/

然后取第一组的内容

【讨论】:

  • 会\w+\。不是更容易,只是修剪尾随的'。'?
  • 嗯,不。听起来更复杂,所以它一定是:) 我认为只要它有效,它并不重要。可能 s/\.w+$// 会很容易。否则 split(/\./) pop last join('.) 也是可能的。你知道当谈到正则表达式时,只有美才重要(在正则表达式爱好者的眼中)
【解决方案3】:

你可以去掉 tld:

s/\.[^\.]*$//;

【讨论】:

  • 虽然这确实去掉了主机名的最后一位,但这不是顶级域名。
【解决方案4】:
(?<Domain>.*)\.(?<TLD>.*?)$

【讨论】:

    【解决方案5】:
    (.*)\.
    

    这并不是特定于 tlds,它只会为您提供一行中最后一个句点之前的所有内容。如果您想对有效的 TLD 或任何内容严格要求,则必须以不同的方式编写。

    【讨论】:

      【解决方案6】:

      我不清楚您希望如何进行匹配。但是使用通常的扩展正则表达式,您应该能够将任何 tld 与 [a-zA-Z]{2,3} 匹配因此,如果您尝试获取 tld 以外的全名,则类似于

      \(.\)\.[a-zA-Z]{2,3}$
      

      应该很接近了。

      【讨论】:

      • 我认为不是。首先,反斜杠都是错误的。其次,即使他们是对的,它也会拒绝 .name 和 .info 之类的 tld。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多