搭配可选模式

问题描述 投票:1回答:1

我有字符串 “X /路径/到/文件/ 400x0 / image.jpg的?V = ASDF”,其中 “400x0” 部分是可选的。

我需要以下比赛为 “X /路径/到/文件/ 400x0 / image.jpg的V = ASDF?”:

  1. /帕兹/该/ PAL /
  2. 400
  3. 0
  4. 图片。 JPG

而对于下面的比赛 “X /路径/到/文件/ image.jpg的V = ASDF?”:

  1. /帕兹/该/ PAL /
  2. -
  3. -
  4. 图片。 JPG

我至今

^(?:[^\/]+)(.*)\/(\d+)x(\d+)\/([^\?]+)这一个,只要能正常工作,因为是“400x0”部分

我的尝试

我试图定义的数字部分为可选^(?:[^\/]+)(.*)(?:\/(\d+)x(\d+))?\/([^\?]+)但在这种情况下,它增加了“400x0”的第一场比赛。它会工作的 “X /路径/到/文件/ image.jpg的?V = ASDF”

我猜?根本就不是正确的操作?

https://regex101.com/r/8eYGyc/3

我使用的node.js 8

node.js regex
1个回答
1
投票

我建议把.*一点更精确/只匹配块,然后比/任何1+字符等,并限制后者的一部分,使其无法比拟\d+x\d+分部:

^[^\/]+((?:\/(?!\d+x\d+(?:\/|$))[^\/]+)*)(?:\/(\d+)x(\d+))?\/([^?]+)

regex demo

细节

  • ^ - 一个字符串的开始
  • [^\/]+ - 1以上字符比/其他
  • ((?:\/(?!\d+x\d+(?:\/|$))[^\/]+)*) - 第1组:中的任何零次或多个重复 \/(?!\d+x\d+(?:\/|$)) - 一个/炭后面没有与digits+x+digits子部分(接着与/或字符串的末尾) [^\/]+ - 1以上字符比/其他
  • (?:\/(\d+)x(\d+))? - 匹配的1点或0的出现的一个可选的非捕获组 \/ - 一个/字符 (\d+) - 第2组:一个或多个数字 x - 一个x字符 (\d+) - 第3组:一个或多个数字
  • qazxsw POI - 一个qazxsw POI图表
  • \/ - 组4:比/其他任何1个或多个字符。
© www.soinside.com 2019 - 2024. All rights reserved.