匹配可选模式

时间:2019-02-05 14:05:04

标签: node.js regex

我有字符串“ x / path / to / file / 400x0 / image.jpg?v = asdf”,其中“ 400x0”部分是可选的。

“ x / path / to / file / 400x0 / image.jpg?v = asdf”需要以下匹配项:

  1. / path / to / file /
  2. 400
  3. 0
  4. image.jpg

以下匹配项“ x / path / to / file / image.jpg?v = asdf”:

  1. / path / to / file /
  2. -
  3. -
  4. image.jpg

我到目前为止有什么

^(?:[^\/]+)(.*)\/(\d+)x(\d+)\/([^\?]+)只要有“ 400x0”部分,这一项就可以正常工作

我尝试过的

我试图将数字部分定义为可选的^(?:[^\/]+)(.*)(?:\/(\d+)x(\d+))?\/([^\?]+),但在这种情况下,它将“ 400x0”添加到第一个匹配项中。它将适用于“ x / path / to / file / image.jpg?v = asdf”

我猜?根本不是正确的运算符?

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

我正在使用node.js 8

1 个答案:

答案 0 :(得分: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组:一个或多个数字
  • \/-一个/字符
  • ([^?]+)-第4组:?以外的任何1个或多个字符。