正则表达式匹配 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 — 匹配 0 和 1 次,尽可能多次,根据需要返回 (贪心)
.*
匹配任何字符(行终止符除外)
*
Quantifier — 匹配 零 和 无限 次,尽可能多次,根据需要返回 (贪婪)
$
在字符串末尾断言位置
【讨论】:
为什么最后一个/
不需要转义?【参考方案4】:
在 Ruby 和 Bash 中,您可以在括号内使用 $
。
/(\S+?)/(\d4-\d2-\d2)-(\d+)(/|$)
(此解决方案类似于 Pete Boughton 的解决方案,但保留了 $
的用法,表示行尾,而不是使用 \z
,表示字符串的结束。)
【讨论】:
据我所知,php 也是如此。我看不出为什么$
实际上在任何实现中都不能在括号 ()
中使用。是括号 []
使它成为字面意思。
$
在 javascript 中以这种方式工作,而 \z
则不能(Chrome 48、Firefox 43、IE9)。
这是最直接的选项。匹配斜线或行尾。它甚至与这个问题的标题相匹配!以上是关于正则表达式匹配 URL 行尾或“/”字符的主要内容,如果未能解决你的问题,请参考以下文章