【问题标题】:Regex to match URL end-of-line or "/" character正则表达式匹配 URL 行尾或“/”字符
【发布时间】:2010-09-15 13:30:33
【问题描述】:

我有一个URL,我正在尝试将它与正则表达式匹配以提取一些组。我遇到的问题是 URL 可以结束 以“/”和更多 URL 文本继续。我想匹配这样的网址:

但不匹配这样的东西:

所以,我认为我最好的选择是这样的:

/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)[/$]

末尾的字符类包含“/”或行尾。不过,字符类似乎对其中的“$”不满意。我怎样才能最好地区分这些 URL,同时仍然拉回正确的组?

【问题讨论】:

    标签: regex


    【解决方案1】:

    要匹配/或内容的结尾,请使用(/|\z)

    这仅适用于您不使用多行匹配的情况(即您匹配的是单个 URL,而不是换行符分隔的 URL 列表)。


    用你所拥有的更新版本来说明这一点:

    /(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|\z)
    

    请注意,我已将开头更改为非空白字符 (\S+?) 的非贪婪匹配,而不是匹配任何东西 (.*)

    【讨论】:

    • 我如何给你更多的点;)谢谢你。仅记录 (/|\A) 将匹配正斜杠或字符串的开头。
    • 注意:JavaScript 不支持 \Z\z
    【解决方案2】:

    你现在有几个正则表达式可以做你想做的事,所以已经充分涵盖了。

    没有提到的是为什么您的尝试不起作用:在字符类中,$(以及^./)没有特殊含义,所以@ 987654325@ 匹配文字 / 或文字 $,而不是终止正则表达式 (/) 或匹配行尾 ($)。

    【讨论】:

    • 这是一个经常被遗忘的东西,在正则表达式文档中也没有提及。
    • 请注意,^ 在字符类中可能具有特殊含义。如果它是该类中的第一个字符,它将使其成为一个否定类,它将匹配除其他字符之外的任何内容。例如要匹配除 a 或 b 之外的任何内容,您可以使用 [^ab]。要包含文字 ^,只需确保它不是第一个,因此要匹配 a、b 或 ^,您将使用 [ab^]。
    【解决方案3】:
    /(.+)/(\d{4}-\d{2}-\d{2})-(\d+)(/.*)?$
    

    第一捕获组(.+)

    .+ 匹配任何字符(行终止符除外)

    • + Quantifier — 匹配 一次无限 次,尽可能多次,根据需要返回 (贪婪)

    第二捕获组(\d{4}-\d{2}-\d{2})

    \d{4} 匹配一个数字(等于[0-9]

    • {4} Quantifier — 精确匹配 4

    - 匹配字符 - 字面意思(区分大小写)

    \d{2} 匹配一个数字(等于[0-9]

    • {2} Quantifier — 精确匹配 2

    - 匹配字符 - 字面意思(区分大小写)

    \d{2} 匹配一个数字(等于[0-9]

    • {2} Quantifier — 精确匹配 2

    - 匹配字符 - 字面意思(区分大小写)

    第三捕获组(\d+)

    \d+ 匹配一个数字(等于[0-9]

    • + Quantifier — 匹配 一次无限 次,尽可能多次,根据需要返回 (贪婪)

    第四抓捕组(.*)?

    ? Quantifier — 匹配 01 次,尽可能多次,根据需要返回 (贪心)

    .* 匹配任何字符(行终止符除外)

    • * Quantifier — 匹配 无限 次,尽可能多次,根据需要返回 (贪婪)

    $ 在字符串末尾断言位置

    【讨论】:

    • 为什么最后一个/ 不需要转义?
    【解决方案4】:

    在 Ruby 和 Bash 中,您可以在括号内使用 $

    /(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|$)
    

    (此解决方案类似于 Pete Boughton 的解决方案,但保留了 $ 的用法,表示行尾,而不是使用 \z,表示字符串的结束。)

    【讨论】:

    • 据我所知,PHP 也是如此。我看不出为什么 $ 实际上在任何实现中都不能在括号 () 中使用。是括号 [] 使它成为字面意思。
    • $ 在 javascript 中以这种方式工作,而 \z 则不能(Chrome 48、Firefox 43、IE9)。
    • 这是最直接的选项。匹配斜线或行尾。它甚至与这个问题的标题相匹配!
    猜你喜欢
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2011-09-23
    • 2015-09-28
    相关资源
    最近更新 更多