正则表达式匹配 URL 行尾或“/”字符

Posted

技术标签:

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

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

http://server/xyz/2008-10-08-4 http://server/xyz/2008-10-08-4/ http://server/xyz/2008-10-08-4/123/more

但不匹配这样的东西:

http://server/xyz/2008-10-08-4-1

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

/(.+)/(\d4-\d2-\d2)-(\d+)[/$]

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

【问题讨论】:

【参考方案1】:

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

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

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

/(\S+?)/(\d4-\d2-\d2)-(\d+)(/|\z)

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

【讨论】:

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

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

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

【讨论】:

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

第一捕获组(.+)

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

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

第二捕获组(\d4-\d2-\d2)

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

4 Quantifier — 精确匹配 4

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

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

2 Quantifier — 精确匹配 2

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

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

2 Quantifier — 精确匹配 2

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

第三捕获组(\d+)

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

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

第四抓捕组(.*)?

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

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

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

$ 在字符串末尾断言位置

【讨论】:

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

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

/(\S+?)/(\d4-\d2-\d2)-(\d+)(/|$)

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

【讨论】:

据我所知,php 也是如此。我看不出为什么 $ 实际上在任何实现中都不能在括号 () 中使用。是括号 [] 使它成为字面意思。 $ 在 javascript 中以这种方式工作,而 \z 则不能(Chrome 48、Firefox 43、IE9)。 这是最直接的选项。匹配斜线或行尾。它甚至与这个问题的标题相匹配!

以上是关于正则表达式匹配 URL 行尾或“/”字符的主要内容,如果未能解决你的问题,请参考以下文章

linux 中 ^[^abc] 正则表达式啥意思

python 正则表达式总结

Notepad++编辑器对文本行首、行尾加上固定字符;每行之间增加空行

Linux命令中使用正则表达式

正则表达式

正则表达式及grep