我有字符串“ x / path / to / file / 400x0 / image.jpg?v = asdf”,其中“ 400x0”部分是可选的。
“ x / path / to / file / 400x0 / image.jpg?v = asdf”需要以下匹配项:
以下匹配项“ x / path / to / file / image.jpg?v = asdf”:
^(?:[^\/]+)(.*)\/(\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
答案 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个或多个字符。