【问题标题】:Case of double dot in url regexurl 正则表达式中双点的情况
【发布时间】:2026-01-16 05:40:01
【问题描述】:
(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//="]*)

regex101.com/r/vd3hHQ/1

我正在使用上述正则表达式来检测输入文本中的 url。它通过了wealth.in..mutual 的情况,但它应该只采用wealth.in。 我需要将点的最大连续出现次数放在正则表达式的最后一部分。

以前我用的是

(?:(?:https?|ftp):\/\/|\b(?:[a-z\d]+\.))(?:(?:[^\s()<>$@,]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))?\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))

【问题讨论】:

    标签: javascript regex url


    【解决方案1】:

    试试这个。它将检查有效的 url。

    (https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9]\.[^\s]{2,})
    

    【讨论】:

    • 嘿,感谢您的回复,但这并没有通过其他大多数情况:(
    • 请解释一下您的长正则表达式,它将大大提高您的回复质量并帮助未来的读者。
    【解决方案2】:

    这是一个最小的重构,它从巨大的字符范围中排除点并重新排列周围的东西。 (包裹在多行中,以便我可以评论更改的内容。)

    # Beginning is the same as before
    (http(s)?:\/\/.)?(www\.)?
    # Here, we exclude dot, and then allow it separately,
    # and repeat one or more times.
    # Also, DNS labels can be at most 63 characters
    (?:[-a-zA-Z0-9@:%_\+~#=]{1,63}\.)+
    # Same as before
    [a-z]{2,6}\b
    # A similar refactoring occurred here
    ((?:[-a-zA-Z0-9@:%_\+~#?&//="]+\.)*
    # Same as before
    [-a-zA-Z0-9@:%_\+~#?&//="]+)?
    

    Regex101 演示:https://regex101.com/r/zRTeTI/2

    否则,我没有检查此内容的正确性;通常,您在 Internet 上找到的 URL 正则表达式存在某种缺陷,因此请谨慎操作。例如,这至少在 IDNA TLD 上似乎仍然失败。

    【讨论】:

    • 也不知道为什么斜线在字符类中是双倍的;也许这是 JavaScript 的一个奇怪的要求?或者只是一个错误。