【问题标题】:Regex to match only urls that contains a certain path正则表达式仅匹配包含特定路径的 url
【发布时间】:2018-03-12 05:29:47
【问题描述】:

我正在使用以下正则表达式

(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?

它向我显示了一个 url,但我只想显示包含

的 URL
/video/hd/

上述正则表达式的以下更正没有正确处理斜线

((?:https\:\/\/)|(?:http\:\/\/)|(?:www\.))?([a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(?:\??)[a-zA-Z0-9\-\._\?\,\'\/\\\+&%\$#\=~]+)

【问题讨论】:

  • 您使用什么语言?你没有逃过/的所有露面
  • 正则表达式位于 chrome 插件中,文档仅列出了 Regex 正则表达式属性可用于提取选择器提取的文本的子字符串。当使用正则表达式时,整个匹配项(组 0)将作为结果返回
  • 哪个 chrome 插件?

标签: regex


【解决方案1】:

您说只使用整个匹配项,并且正则表达式不包含反向引用。因此,我们可以将正则表达式中的所有捕获组(())替换为非捕获组((?:))。其中一些组是多余的,http|https 可以简化为https?。这一起给了我们

(?:https?|ftp)://[\w_-]+(?:\.[\w_-]+)+(?:[\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?

_ 不允许在主机名中:

(?:https?|ftp)://[\w-]+(?:\.[\w-]+)+(?:[\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?

从技术上讲,- 不能出现在主机名的开头或结尾,但我们会忽略它。您的正则表达式也不允许非默认端口或 IPv6 主机,但我们也会忽略这一点。

你的正则表达式的最后一部分匹配的内容(大概是为了匹配路径、查询字符串和锚点)可以与主机名重叠(\w 和 - 都在两个字符类中) .我们可以通过在主机名后使用/ 或? 分隔符来解决此问题:

(?:https?|ftp)://[\w-]+(?:\.[\w-]+)+(?:[/?][\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?

现在我们可以开始查看您的附加要求:URL 应包含 /video/hd/。大概这个字符串应该出现在路径的某个地方。我们可以这样编码:

(?:https?|ftp)://[\w-]+(?:\.[\w-]+)+/(?:[\w.,@^=%&:/~+-]*/)?video/hd/(?:[\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?

我们现在总是需要在主机名后面加上 /,而不是匹配可选的分隔符 / 或 ?。这个/ 后面必须直接跟video/hd/ 或0 个或多个路径字符和另一个/,然后跟video/hd/。 (路径字符集不包括?(将启动查询字符串)或#(将启动锚点)。)

和以前一样,在/video/hd/ 之后可以有更多路径组件的最后一部分、一个查询字符串和一个锚点(都是可选的)。

【讨论】:

    【解决方案2】:

    首先,您需要一个正则表达式来匹配 URL(无论是 http、https...)

    (([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))
    

    一旦你得到它,你需要选择它们而不是“消耗”它们。您可以使用前瞻来执行此操作,即断言当前位置之后的正则表达式是例如foo:

    (?=foo)
    

    当然你会用我写的第一个正则表达式替换foo。

    此时,您知道您选择了一个 URL;现在您只需将搜索限制为包含 /video/hd 的 URL:

    .*\/video\/hd\/.*
    

    所以完整的正则表达式是

    (?=(([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))).*\/video\/hd\/.*
    

    您可以通过现场演示来测试它here。

    【讨论】:

    • 感谢您提供所有信息并指导一个问题我发现正则表达式也匹配分号作为 url 链接的一部分 (regex101.com/r/nmW218/1)
    • 是的,他们确实有一个特定的meaning
    猜你喜欢
    • 1970-01-01
    • 2017-11-08
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多