【问题标题】:Regex matching everything starting with "/api" but not finishing with ".jpg" or "statistics"正则表达式匹配以“/api”开头但不以“.jpg”或“statistics”结尾的所有内容
【发布时间】:2017-04-06 03:49:16
【问题描述】:

我需要一个正则表达式与 Chrome 的网络日志一起使用,以仅显示 API 调用,除了两个特定端点:

例如:

我想显示所有包含/api/:

http://localhost:8081/api/software-features
http://localhost:8081/api/user-groups/logged-user-group
http://localhost:8081/api/user-groups/%7B4D7E2585-32E3-4794-A0F3-4FE7D56D27AE%7D/permissions/system
http://localhost:8081/api/servers/%7B499C3279-CD5D-402E-A60B-6AE0B5A21EE0%7D/cameras
etc...

除非它以/image-640x480.jpg/statistics 结尾:

http://localhost:8081/api/servers/%7B499C3279-CD5D-402E-A60B-6AE0B5A21EE0%7D/cameras/0/streams/0/statistics
http://localhost:8081/api/servers/%7B499C3279-CD5D-402E-A60B-6AE0B5A21EE0%7D/cameras/0/streams/0/image-640x480.jpg

这两个是前端不断请求的,会在日志中产生噪音。

【问题讨论】:

  • 您已经告诉我们正则表达式的失败之处,但没有向我们展示正则表达式。
  • regex101.com自己尝试学习
  • 我试过regexr.com,但一切都失败了。对于我的 regex-foo 来说,这是一个非常复杂的案例。如果我不需要它,我就不会寻求帮助。我的意思是他们说你可以在这个地方“得到专家的帮助”,对吧?
  • 什么正则表达式风格?
  • @NicolasMaltais 用于 Chrome 的开发者控制台,在网络选项卡的过滤器中。我不确定那里有什么限制。

标签: regex google-chrome google-chrome-devtools


【解决方案1】:

要匹配以/api 开头且不以多个替代项结尾的字符串,您需要使用带有否定环视的正则表达式:

^/api(?!.*(?:[.]jpg|statistics)$)

详情

  • ^ - 字符串的开头
  • /api - 字符串开头的文字文本
  • (?!.*(?:[.]jpg|statistics)$) - 如果在 /api 之后有除换行符之外的任何 0+ 字符并且在末尾有 .jpg ([.]jpg) 或 (|) statistics 时,则匹配失败的负前瞻字符串 ($)。

【讨论】:

    【解决方案2】:

    不是正则表达式,但我相信它可以解决问题:

    (str.search(/\/api/i) >=0 && str.search(/\.jpg/i) == -1 && str.search(/\/statistics/i) == -1 )
    

    在您的样品上试用:

    const urls = [
      "http://localhost:8081/api/software-features",
      "http://localhost:8081/api/user-groups/logged-user-group",
      "http://localhost:8081/api/user-groups/%7B4D7E2585-32E3-4794-A0F3-4FE7D56D27AE%7D/permissions/system",
      "http://localhost:8081/api/servers/%7B499C3279-CD5D-402E-A60B-6AE0B5A21EE0%7D/cameras",
      "http://localhost:8081/api/servers/%7B499C3279-CD5D-402E-A60B-6AE0B5A21EE0%7D/cameras/0/streams/0/statistics",
      "http://localhost:8081/api/servers/%7B499C3279-CD5D-402E-A60B-6AE0B5A21EE0%7D/cameras/0/streams/0/image-640x480.jpg"
    ];
    
    console.log([for (url of urls) (url.search(/\/api/i) >=0 && url.search(/\.jpg/i) == -1 && url.search(/\/statistics/i) == -1 )])
    
    // Array [ true, true, true, true, false, false ]
    

    【讨论】:

      【解决方案3】:

      你也可以试试this regex,它适用于大多数正则表达式引擎

      ^.*\/api\/(?!.*(?:\.jpg|statistics)$).*$
      
      • ^ 匹配字符串的开头
      • .*\/api\/ 匹配 \api\ 以及之前的所有内容
      • (?!.*(?:\.jpg|statistics)$) 这是一个否定的前瞻,如果下一个字符是 .* 后跟 .jpgstatistics 以及字符串的结尾,则匹配将停止
      • .*$ 匹配 /api/ 之后的所有内容,以防负前瞻不匹配

      【讨论】:

        猜你喜欢
        • 2015-07-20
        • 2011-12-14
        • 2014-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多