我有字符串“x/path/to/file/400x0/image.jpg?v=asdf”,其中“400x0”部分是可选的。
我需要“x/path/to/file/400x0/image.jpg?v=asdf”的以下匹配:
- /路径/到/文件/
- 400
- 0
- 图片.jpg
以下匹配“x/path/to/file/image.jpg?v=asdf”:
- /路径/到/文件/
- -
- -
- 图片.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
最佳答案
我建议使 .*
更精确一点,仅匹配 /
block ,然后匹配除 /
之外的任何 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 个或多个字符。
关于node.js - 匹配可选模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54536201/