【发布时间】:2017-03-05 07:23:26
【问题描述】:
我试图从字符串中捕获任何看起来像域名的东西的第一次出现。例如 my.domain.home.com 来自 '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”中的点之后开始捕获。在可能的域字符串的开头。
我也使用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'
)
【问题讨论】: