0

我有这种网站的网址结构:

/some_url/{slug}/ 

其中 {slug} 包含有关字段排序(仅价格和名称)、订单方向(asc、desc)、限制行(30、40 或空)和演示类型(列表或空)的信息。例如:

/some_url/price_desc_30_list/

如您所见,每个组都用下划线分隔,但仅适用于中间组。每个组都是可选的,在前面的示例中 url 由三组price_desc, 30,list组成。我想要的是获得每个组的价值。

目前我的正则表达式是(?:(price|name)_(asc|desc))?(?:_?(30|40))?(?:_?(list))?,但是下划线有问题(只有在前一个组存在时,我才需要它们在组的开头)所以这个 url/some_url/_30/和这/some_url/30/两个都将匹配,但我只需要/some_url/30/

4

1 回答 1

1

好的,我尝试了这个:

\/([^_\/]+)(?:_([^_\/]+)?_?)?(?:_([^_\/]+)?_?)?(?:_([^_\/]+)?_?)?\/$

并在regex101上进行了测试。

不知道为什么

\/([^_\/]+)(?:_([^_\/]+)?_?){0,3}\/$

虽然没有工作:(

编辑:新的正则表达式

^\/(.*?)\/(?:(?<!\/_)(price|name)(?!_\/))?_?(?:(?<!\/_)(asc|desc)(?!_\/))?_?(?:(?<!\/_)(30|40)(?!_\/))?_?(?:(?<!\/_)(list)(?!_\/))?\/$

经过测试

(?!...)是一个否定的前瞻,并防止匹配一个字符,然后是前瞻内的字符集。例如(list)(?!_\/),防止匹配list_/sincelist后跟_/.

(?<!...)是一个否定的lookbehind,并防止在lookbehind中匹配前面的字符集。例如(?<!\/_)(list),阻止了/_listsince的匹配list/_.

于 2013-05-30T10:09:16.507 回答