正则表达式匹配空字符串或除请求映射的特定字符串外的任何字符串

Regex to match empty or any string except a specific string for request mapping

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

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

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

当前输出:

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

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

如果您使用的是 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,您可以利用 Optional class 的 Java 8:

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