鉴于域名my.local.domain.com
,我想提取以下部分:
匹配#1:my.local.domain
...排除顶级域名(com)
匹配#2:local.domain
...排除顶级域名(com)和第一部分(我的)
匹配#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个点分隔部分,它就不再起作用了。我正在努力让内部括号可选。
有什么暗示吗?非常感谢!
答案 0 :(得分:2)
由于选项限制,它变得有点复杂,但是以下是关于你的例子:
((?:\w+\.)*?(\w*?\.?(\w+)))\.com$
请参阅http://regex101.com/r/aJ6bZ0/1
上所有运营商的技术说明逻辑如下:
(\w+)\.com$
与域名匹配(\w*\.?(...))
可选择匹配前面的子域(?:\w+\.)*
可选择匹配所有前面的子子域*?
而不是*
将迫使操作员变得懒惰 - 它首先不匹配任何字符,因此从第1步开始给予贪婪的\w+
机会以匹配整个域名,如果没有子域名答案 1 :(得分:1)
' +'正则表达式符号可以被认为是"一次或多次"。你会想要使用' *' - 0次或更多次或'?' - 0或1次。这适用于您的文字'。'哪个应该发生?或根据您的上述说明进行0次或更多次。
请参阅this google search以获取大量便捷参考资料,以便进一步提供帮助。 (他们都说大致相同的事情,但有选择权很好)