【问题标题】:regex capturing to start at \b or end of (www\.)正则表达式捕获从 \b 或 (www\.) 的结尾开始
【发布时间】: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'
 ) 

【问题讨论】:

    标签: regex teradata


    【解决方案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域名就比较麻烦了,留给有兴趣的读者去解决吧。

    【讨论】:

    • - 包含在[a-z0-9-]
    • 我明白你的意思。我很困惑,因为给定的正则表达式与问题中的示例字符串不匹配,但是当我取出 xn-- 时(部分)匹配;我已经编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多