node.js - 匹配可选模式

标签 node.js regex

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

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

  1. /路径/到/文件/
  2. 400
  3. 0
  4. 图片.jpg

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

  1. /路径/到/文件/
  2. -
  3. -
  4. 图片.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/

相关文章:

javascript - 处理更新 Twilio 功能 token 的最佳方法?

javascript - 在 nodejs 中使用 selenium-webdriver 和 phantomjs 设置用户代理

regex - 使用 golang 解析 Perl 正则表达式

用于解析目录和文件名的正则表达式

javascript - Node.js 时刻时区转换未按预期工作

javascript - 矩阵所有行的值变化

javascript - 关于Web应用程序如何工作以及服务器客户端如何实现的问题

Ruby 正则表达式 - gsub 仅捕获组

regex - 在 ReplaceAllStringFunc 回调中获取组值

javascript - ^((?<!\/)\/[A-Za-z0-9_-]*)+$ 的正则表达式无效量词