我试图从字符串中捕获任何看起来像域名的东西。来自my.domain.home.com
的examaple 'dfasdf https://www.my.domain.home.com fadsfas'
。我使用\b
断言或非捕获组(?:www\.)
来标记捕获组的开始。但我得到www.my.domain.home.com
,即www.
未被删除。
这是我的完整正则表达式:
\b(?:www\.)((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b
这是我不确定的部分:
\b(?:www\.)
如何在“www。”单词或结尾的开头处开始捕捉?
[澄清] 如果没有'www。'它应该在单词的开头捕获。如果有'www。'它应该在'www'中的点后开始捕获。在可能的域字符串的开头。
我已经用https://www.regex101.com/r/NjR11m/1/tests检查了它,但我的最终目的地是Teradata 15.10正则表达式,据说它符合Perl方言。所以,如果你能在Perl环境中帮助我,我想我会没事的。
SELECT 'dfasdf https://www.my.domain.home.com fadsfas' AS string,
REGEXP_SUBSTR(string,
'\b(?:www\.)((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b'
) AS url_to_match;
对于'dfasdf https://my.domain.home.com fadsfas'
,它也应该返回my.domain.home.com
。
还应返回my.domain.home.com
'dfasdf my.domain.home.com fadsfas'
'dfasdf ,my.domain.home.com-- fadsfas'
'dfasdf www.my.domain.home.com#fadsfas'
[溶液]
REGEXP_SUBSTR(LOWER(string),
'\b(?!www\.)((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b'
)
答案 0 :(得分:1)
匹配中包含www.
的问题似乎是因为您正在使用第0组(完全匹配,而不仅仅是捕获组)。虽然我不知道如何更改它,但可以重新配置正则表达式,以便组0和组1具有相同的值,如下所示:
\b(?!www\.)([-a-z0-9]{1,63}(?:\.[-a-z0-9]{1,63})+)
这只是说匹配不能从www.
开始,而不是让匹配从那里开始然后不得不忽略它。
我制作了modified version你的正则表达式,展示了它是如何工作的。请注意,如果您希望将名称与大小写字母数字匹配,则需要将A-Z
添加到a-z0-9
,或启用不区分大小写;匹配非ascii域名是更多的工作,留给感兴趣的读者解决。
答案 1 :(得分:-1)
\b(?:https:\/\/(?:www\.)?)([^\/\s]+)
此正则表达式查找带有或不带https://
的{{1}},然后返回结果的其余部分,直到达到www.
或空格。
请参阅regex101
上的示例