【问题标题】:Regex not capturing repeating optional captures正则表达式不捕获重复的可选捕获
【发布时间】:2017-10-27 15:38:38
【问题描述】:

我正在尝试为我公司的网站编写 URL 重写正则表达式。 URL 将始终以category/.+ 开头,之后最多可以添加 5 个额外的标签。使用我当前的正则表达式,它总是在类别之后捕获.+,然后将之后的所有内容添加到该捕获组中。 示例数据

/category\/(.+)(?:\/(?:page|price|shipping|sort|brand)\/(.*))*/
mysite.com/category/15000000
mysite.com/category/15000000/page/2
mysite.com/category/15000000/page/2/price/g10l20
mysite.com/category/60000000/page/2/price//shipping//brand//sort/

结果总是

$1 = 15000000
    //desired $1 = 15000000
$1 = 15000000/page/2
    // desired $1 = 15000000 $2 = 2
$1 = 15000000/page/2/price/g10l20
    // desired $1 = 15000000 $2 = 2 $3 = g10l20
$1 = 60000000/page/2/price//shipping//brand//sort/
    // desired $1 = 60000000 $2 = 2 $3 = "" $4 = "" $5 = "" $6 = ""

我的理解是,零个或多个量词会使其返回,并再次搜索“标志”模式,但显然情况并非如此。有人可以告诉我我做错了什么吗?

【问题讨论】:

  • 试试这个/category\/(.*?)(?:\/(?:page|price|shipping|sort|brand)\/(.*))*$/
  • 好吧,它成功地将最后一个测试用例分成两组,$1 = 60000000$2 = /page/2/price//shipping//brand//sort/,但我需要每个“标志”来导致它自己的捕获,无论它是否为空。跨度>
  • 啊,我知道你在追求什么。这只能使用 .NET、PyPi 和专门编译的 Boost 正则表达式库以编程方式完成。

标签: regex url-rewriting ecma262


【解决方案1】:

不幸的是,无法从正则表达式中保留不确定数量的捕获。当使用 + * {n} 等重复捕获时,仅返回最近捕获的组。

你知道你最多会有 5 个标签,你可以像这样重复相关块 5 次:

/category\/([^/]*)(?:\/(page|price|shipping|sort|brand)\/([^/]*))?(?:\/(page|price|shipping|sort|brand)\/([^/]*))?(?:\/(page|price|shipping|sort|brand)\/([^/]*))?(?:\/(page|price|shipping|sort|brand)\/([^/]*))?(?:\/(page|price|shipping|sort|brand)\/([^/]*))?/

这太丑了,允许重复一个标签,如果要添加更多标签,需要扩展正则表达式。

最简洁的解决方案可能是在 $1 中捕获类别 ID,在 $2 中捕获参数字符串的其余部分 - 您需要让应用程序解析它,它可以比在正则表达式中更简洁地完成.

/category\/([^/]*)(\/.*)?/

【讨论】:

  • 谢谢。我能够将您的解决方案稍微浓缩为/category\/([^/]+)(?:\/page\/([^/]?))?(?:\/price\/([^/]*))?(?:\/shipping\/([^/]*))?(?:\/brand\/([^/]*))?(?:\/sort\/([^/]*))?/,这可以按预期工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 2016-03-03
  • 2017-09-13
  • 2011-03-11
  • 2017-01-07
  • 2019-12-19
  • 1970-01-01
相关资源
最近更新 更多