如何使用正则表达式验证捕获组中的最后一个字符

Posted

技术标签:

【中文标题】如何使用正则表达式验证捕获组中的最后一个字符【英文标题】:How to validate the last character in a capture group with regex 【发布时间】:2021-02-05 08:01:06 【问题描述】:

我想从 URL 中提取路径并且我想使用正则表达式。

我正在使用这个正则表达式: ^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\n\?\=ֿ\#]+)

还有一个副作用是最后一个/ 被捕获。

例如-

domain.com/home/ = domain.com/home/
domain.com/home?param=value = domain.com/home

如何验证特定捕获组的最后一个字符不是/

注意 - 我知道我可以通过另一个正则表达式匹配来解决这个问题,但我认为可以通过一个匹配来完成。

【问题讨论】:

【参考方案1】:

一种方法可能是将/ 添加到否定字符类以使其不匹配,并且仅在其后跟除/ 或空白字符之外的任何字符时匹配它。

^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?((?:[^:\n?=ֿ#\/]+|\/(?=[^\s\/])[^:\n?=ֿ#\/]*)*)

最后一部分会匹配

( 捕获第 1 组 (?:非捕获组 [^:\n?=ֿ#\/]+ 匹配除了列出的任何字符,包括/ |或者 \/(?=[^\s\/]) 匹配 / 时直接跟随除 / 或空白字符以外的任何字符 [^:\n?=ֿ#\/]* 匹配所列以外的可选字符 )*关闭非捕获组并重复0+次以匹配多个/ )关闭第一组

Regex demo

【讨论】:

【参考方案2】:

你可以让你的最后一场比赛是非贪婪的,然后是可选的/。然后确保后面跟着? 或结尾:

^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\n?=ֿ#]+?)\/?(?=\?|$)

RegEx Demo

您的组 #1 将在最后一个 / 之前停止一个位置,假设 URL 以该位置结尾或之后有一个查询字符串。

【讨论】:

以上是关于如何使用正则表达式验证捕获组中的最后一个字符的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式中 如何取出所有组中的值?

具有不同量词的正则表达式捕获组

正则表达式将字符串中的值捕获到一个组中,而不考虑顺序?

如何从正则表达式捕获组中修剪空白?

如何使用正则表达式捕获科学记数法中的减号?

用于检查 4 个不同字符组中的至少 3 个的正则表达式