正则表达式捕获开始于\ b或结束(www \。)

时间:2016-10-23 12:15:05

标签: regex perl teradata

我试图从字符串中捕获任何看起来像域名的东西。来自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方言。所以,如果你能在Pe​​rl环境中帮助我,我想我会没事的。

 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'
 ) 

2 个答案:

答案 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

上的示例