【问题标题】:Regex that matches anything not ending in .json匹配任何不以 .json 结尾的正则表达式
【发布时间】:2014-02-23 00:00:01
【问题描述】:

对于一个网络应用程序,我试图想出一个 javascript 正则表达式,它匹配任何不以.json 结尾的东西。听起来很简单,但我发现它非常难。

我最初想这样做:^.*(?!\.json$),但这显然行不通,因为它只是匹配整个字符串。然后我尝试了^[^\.]*(?!\.json$),但它匹配abc.json中的ab。

我已经想出了两个可以完成这项工作的正则表达式,但我想要一个可以做到这一点的正则表达式。

// Match anything that has a dot but does not end in .json
^.*\.(?!json$)
// Match anything that doesn't have a dot
^[^\.]*$

我喜欢http://regex101.com/#javascript 来测试它们。

我在app.get(REGEXP, routes.index) 中使用正则表达式作为 ExpressJS 路由定义的一部分。

【问题讨论】:

    标签: javascript regex express


    【解决方案1】:

    试试/^(?!.*\.json$).*$/

    /^(?!.*\.json$).*$/.test("foo.json")
    false
    /^(?!.*\.json$).*$/.test("foo")
    true
    /^(?!.*\.json$).*$/.test("foo.html")
    true
    

    【讨论】:

    • @TheFonz:您仍然应该考虑其他两个答案中的另一个选项。关于代码可读性的完全正确的观点。
    【解决方案2】:

    您总是可以只获取文件扩展名,然后进行比较。

    正则表达式查找文件扩展名

    /\.[^.]*$/

    获取文件扩展名

    var extension = /\.[^.]*$/.exec("something.json");
    
    if(extension[0] === ".json"){
        //do something
    }
    

    【讨论】:

    • 好点。优雅的解决方案。如果我不使用 Express.js 的 app.get(REGEX, routes.index); 语法,肯定会考虑这一点。
    • 哦,这改变了一切。是的,我想我会在这里选择其他答案
    【解决方案3】:

    也许您可以测试“不匹配(.json)”而不是测试“匹配(非 .json)”,这很简单?

    【讨论】:

    • 感谢您的回答,如果我不想使用 Express.js 的 app.get(REGEX, routes.index);,我会这样做
    • @TheFonz:如果我错了,请纠正我,但是您不能将扩展名设为可选参数并测试它是否为“.json”吗?编辑:例如/foo(\.\w+)?/
    • 是的,但我不确定这将如何与上面评论中的函数一起使用......使用正则表达式更容易。文件名也可以是任何东西。
    • @TheFonz:使用我提供的确切正则表达式,您可以使用req.params[0] 访问扩展。如果您还想将文件名作为第一个参数(例如,/([^.])(\.\w+)?/),则扩展名是req.params[1]。见expressjs.com/api.html#app.VERB。
    • @bvukelic 啊,我明白你现在的意思了。是的,那也很好用。感谢您的澄清。
    【解决方案4】:

    我会创建一个正则表达式来匹配 .json,然后当您检查它时,使用 a 反转逻辑

    匹配 == 假

    这样会简单得多,它会显示您正在尝试做的事情,使其对其他程序员更加明显。

    【讨论】:

    • 不知道为什么这被否决了,但这是一个非常合乎逻辑的解决方案。这不是严格的正则表达式,但它是有效的。
    • 除非他们的问题只是他们需要的更大正则表达式的一部分——例如,他们可能需要匹配文件名的一部分以供以后提取;如果你只匹配它命中 JSON 然后拒绝它,你不能将它们结合起来。使用负前瞻,您可以。
    • 感谢您的评论。不能那么容易,我正在使用 Express.js 并想使用 app.get(REGEX, routes.index); 语法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多