Java 角度html5模式和HAL浏览器

Java 角度html5模式和HAL浏览器,java,angularjs,regex,spring,spring-boot,Java,Angularjs,Regex,Spring,Spring Boot,我正在AngularJS应用程序中实现html5模式。在服务器中,我需要将没有后缀的所有内容(因此没有扩展,不是静态资源)转发到基本url: @RequestMapping(value = "/{path:[^\\.]*}") public String redirect(HttpServletRequest request) { return "forward:/"; } 这对于Angular应用程序来说很好,但是现在人们想要使用HAL浏览器,并且这个控制器也在转发一些浏览器请求,比

我正在AngularJS应用程序中实现html5模式。在服务器中,我需要将没有后缀的所有内容(因此没有扩展,不是静态资源)转发到基本url:

@RequestMapping(value = "/{path:[^\\.]*}")
public String redirect(HttpServletRequest request) {
    return "forward:/";
}
这对于Angular应用程序来说很好,但是现在人们想要使用HAL浏览器,并且这个控制器也在转发一些浏览器请求,比如

是否可以修改正则表达式以匹配没有后缀的所有内容(就像现在一样),以及没有/api的所有内容

这是当前的正则表达式:

"/{path:[^\\.]*}"
例如:

它不应匹配:

  • 任何东西/api
  • 任何事
  • 任何东西/filename.extension
  • anything/filename.extensionanything
(列表中的最后两点与当前正则表达式一致)

它应该匹配:

  • 上面没有列出的一切
看来您可以使用

"/{path:(?!.*api)[^.]*}"
它匹配一个字符串,该字符串在行的任何位置都没有点和子字符串。请注意,如果您有多行输入,请使用
[\s\s]
,而不要使用前瞻中的
。该模式还允许空字符串(如果不允许空输入,则将final
*
替换为+`)


另外,请注意,如果模式在默认情况下没有被锚定(我认为它在这里),或者您希望在regex测试程序中测试它,那么您需要添加锚定:
“/{path:^(?。*api)[^.]*$}”
^
锚点匹配字符串的开头,而
$
锚点匹配字符串的结尾。

请尝试
“/{path:^(?https?://././[^/]+)[^.]*}”
但为什么选择https?它应该匹配没有扩展的所有内容和没有api的所有内容。我将编辑以添加一个examplesOk列表,请尝试以下操作:“/{path:^(?)(?:.[^/])?api)[^.]*$}”您可以。最后它是这样工作的:“/{path:(?!(?:*)api)[^.]*}”它似乎工作正常。最后一个问题,如果我想匹配一个没有点的字符串,并且在行首没有api子字符串(api不在任何地方,但不仅仅在行首),要匹配行首的模式,需要
^
锚定或
(?m^
(^\n)
。因此,您需要类似于
(^ |\n)(?!api)[^.]*$