【问题标题】:Nested regular expression for domain matching用于域匹配的嵌套正则表达式
【发布时间】:2014-11-29 23:46:22
【问题描述】:

给定域名my.local.domain.com,我想提取以下部分:

匹配 #1:my.local.domain ... 不包括顶级域 (com)
匹配 #2:local.domain ... 不包括顶级域 (com) 和第一部分 (my)
匹配 #3:domain ... 不包括顶级域 (com) 和两个前导部分 (my.local)

正则表达式不必匹配无限数量的点分隔部分,如果字符串变长,则只有后面的 3 个部分是相关的。

my.local.domain.com:
#1:my.local.domain
#2:local.domain
#3:domain

my.other.local.domain.com
#1:my.other.local.domain
#2:local.domain
#3:domain

如果它更短,则应该匹配:

domain.com
#1:domain
#2:domain

到目前为止,这是我的正则表达式:^(.+\.(.+\.(.+)?)?)\.com$,问题是只要域中的点分隔部分少于 4 个,它就不再起作用了。我正在努力使内括号可选。

对此有任何提示吗?非常感谢!

【问题讨论】:

  • 您是否尝试将可选组件的+ 替换为*
  • 是的。问题也是点(\.)在两者之间应该是可选的,但是如果我以任何方式重新排列正则表达式,它只会变得更糟。这是我能得到的最接近的值。

标签: regex nested


【解决方案1】:

由于可选性限制,它变得有点复杂,但以下适用于您的示例:

((?:\w+\.)*?(\w*?\.?(\w+)))\.com$

查看http://regex101.com/r/aJ6bZ0/1上所有运营商的技术说明

逻辑如下:

  1. (\w+)\.com$ 匹配域
  2. (\w*\.?(...)) 可以选择匹配前面的子域
  3. (?:\w+\.)* 可以选择匹配所有前面的子域
  4. *? 而不是 * 将迫使运营商变得懒惰 - 它从不匹配任何字符开始,因此如果没有子域,则从第一步开始给贪婪的 \w+ 一个机会来匹配整个域

【讨论】:

  • 呃哦,我想就是这样。 :) 非常感谢!在这上面拉我的头发。
  • 组合 *? 让我感到困惑。是0 or more and optional的意思吗?
  • 刚刚添加了一些解释 - 您可以尝试将 *? 替换为 *+ 替换为 +? 来试验惰性与贪婪运算符的效果。
【解决方案2】:

“+”正则表达式符号可以被认为是“一次或多次”。您可能想使用 '*' - 0 次或多次或 '?' - 0 或 1 次。这适用于您的文字“。”同样,应该发生什么?或者根据您上面的解释0次或多次。

请参阅this google search 以获取大量方便的参考资料,以进一步提供帮助。 (他们都说大体相同的事情,但有选择的感觉很好)

【讨论】:

  • 感谢您的反馈。我知道 + 和 * 模式符号,但我仍然无法修改正则表达式以获得所需的结果。
  • 关键的区别在于贪婪和懒惰的运营商,而不是+* 在这种特殊情况下..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多