2016-07-29 141 views
1

我在AngularJS应用程序中实现了html5模式。在服务器,我需要没有后缀(所以没有扩展,而不是一个静态的资源)的基本URL转发的一切:Angular html5模式和HAL浏览器

@RequestMapping(value = "/{path:[^\\.]*}") 
public String redirect(HttpServletRequest request) { 
    return "forward:/"; 
} 

这是对角的应用程序工作正常,但现在人们希望使用HAL浏览器和此控制器也转发一些浏览器请求,如https://localhost:8080/api

是否有可能修改正则表达式以匹配没有后缀的所有内容(因为它是现在)以及没有/ api的所有内容?

这是当前的正则表达式:

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

例如:

它不应该匹配:

  • 什么/ API
  • 什么/ apianything
  • 什么/ filename.extension
  • 什么/ filename.extensionanything

(最后两个列表中的点是确定当前正则表达式)

应该匹配:

  • 一切之上
未上市
+0

尝试'“/{path:^(?!https?://.*/[^/]+)[^.]*}”' –

+0

但是为什么https?它应该匹配没有扩展名的所有内容,并且不带任何API。我会编辑添加一个例子列表 –

+1

好吧,试试''/ {path:^(?!(?:。* [^ /] /)?api)[^。] * $}“' –

回答

1

看来你可以使用

"/{path:(?!.*api)[^.]*}" 

它匹配一个字符串,该字符串没有任何点,也没有api子串。请注意,如果您有多行输入,请在预览内使用[\s\S]而不是.。该模式还允许空字符串(如果不允许空输入,则用+替换最终的*)。另外,请注意,如果模式没有默认锚定(我认为它在这里),或者您想在正则表达式测试人员测试它,您需要添加锚点:"/{path:^(?!.*api)[^.]*$}"。该^锚点匹配字符串的开头,并且$锚点匹配字符串的结尾。

+0

它似乎工作。最后一个问题,如果我想匹配一个没有点的字符串,并且在行开始时没有api子字符串(api不在任何地方,但不仅在开始时),那么这将如何呢? –

+0

要匹配在开始处的模式该行,你需要'''anchor或'(?m)^'或者'(^ | \ n)'。所以你需要像'(^ | \ n)(?! api)[^。] * $'' –

+0

好,谢谢你! –