【问题标题】:Regex to match empty or any string except a specific string for request mapping正则表达式匹配空字符串或除请求映射的特定字符串外的任何字符串
【发布时间】:2019-11-12 11:21:43
【问题描述】:

我需要为一个 URL 做一个请求映射,它会匹配一个空字符串,或者除正斜杠字符后的特定字符串之外的任何字符串:/

下面的正则表达式匹配/之后的任何字符串,并忽略特定字符串"resources",但它不匹配正斜杠/之后的空字符串。

@RequestMapping(value = "/{page:(?!resources).*$}")

当前输出:

/myapp/abc - matches and handles - ok
/myapp/resoruces - matches and ignores this URL - ok
/myapp/ - not matched <<<<<< expected to match!

这个正则表达式有什么问题?

【问题讨论】:

    标签: java regex spring-mvc request-mapping


    【解决方案1】:

    如果您使用的是 spring 5,那么使用多个像这样的映射以及可选的@PathVariable

    @RequestMapping({"/", "/{page:(?!resources).*$}"})
    public void pageHandler(@PathVariable(name="page", required=false) String page) {
        if (StringUtils.isEmpty(page)) {
            // root
        } else {
            // process page
        }
    }
    

    如果您使用的是 Spring 4,并且可以利用 Java 8 的 Optional 类:

    @RequestMapping({"/", "/{page:(?!resources).*$}"})
    public void pageHandler(@PathVariable("page") Optional<String> page) {
        if (!page.isPresent()) {
            // root
        } else {
            // process page
        }
    }
    

    【讨论】:

    • 完美,第一个选项有效,但如果我在 /myapp 之后有多级路径,那么它不会匹配,例如 /myapp/abc/report 不匹配,我可以在之后有任意数量的路径/myapp
    • @RequestMapping({"/", "/{page:(?!resources).*$}/**"}) 在 /myapp 之后匹配多级路径
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    相关资源
    最近更新 更多