捕获排除两个文字的正则表达式

Capturing regexp which excludes two literals

在 Spring 控制器中,我想要一个 updateuser 端点、一个 deleteuser 端点和一个捕获其余选项的通用端点:

@PostMapping(value = "/{action:^((?!(updateuser|deleteuser)).)+}")
// Do something depending on `action`, need to capture the match

@PostMapping(value = "/updateuser")
// Update user

@PostMapping(value = "/deleteuser")
// Delete user

使用正则表达式抛出:

The number of capturing groups in the pattern segment (^((?!updateuser|deleteuser).)*) does not match the number of URI template variables it defines, which can occur if capturing groups are used in a URI template regex. Use non-capturing groups instead.

我用@PostMapping(value = "/{action:^.*(?!updateuser)}")

没问题

哪个是正确的正则表达式?

您可以排除 updateuser 和 deleteuser,方法是在没有捕获组的情况下使用单个否定前瞻,而不是使用 匹配单个字符后跟断言的方法。

^(?!.*(?:update|delete)user).+$

如果应该更严格,可以使用单词边界来防止部分单词匹配:

^(?!.*\b(?:update|delete)user\b).+$

看到一个regex demo