【问题标题】:Angular html5 mode and HAL browserAngular html5 模式和 HAL 浏览器
【发布时间】:2016-12-03 21:09:04
【问题描述】:

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

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

这对于 Angular 应用程序来说工作得很好,但是现在人们想要使用 HAL 浏览器,并且这个控制器还转发了一些浏览器请求,例如 https://localhost:8080/api

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

这是当前的正则表达式:

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

例如:

不应该匹配:

  • 任何东西/api
  • 任何东西/apianything
  • 任何东西/文件名.extension
  • anything/filename.extensionanything

(列表中的最后两点与当前的正则表达式一致)

应该匹配:

  • 上面未列出的所有内容

【问题讨论】:

  • 试试"/{path:^(?!https?://.*/[^/]+)[^.]*}"
  • 但是为什么是 https?它应该匹配没有扩展名的所有内容和没有 api 的所有内容。我将编辑以添加示例列表
  • 好的,试试"/{path:^(?!(?:.*[^/]/)?api)[^.]*$}"
  • 你可以test it here
  • 最后它是这样工作的:"/{path:(?!(?:.*)?api)[^.]*}"

标签: java angularjs regex spring spring-boot


【解决方案1】:

看来你可以使用

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

它匹配一个没有点的字符串,并且在该行的任何地方都没有api 子字符串。请注意,如果您有多行输入,请在前瞻中使用 [\s\S] 而不是 .。该模式还允许空字符串(如果不允许空输入,则将 final * 替换为 +`)。

另外,请注意,如果默认情况下模式没有锚定(我认为它在这里)或者你想在正则表达式测试器上测试它,你需要添加锚点:"/{path:^(?!.*api)[^.]*$}"^ 锚点匹配字符串的开头,$ 锚点匹配字符串的结尾。

【讨论】:

  • 它似乎有效。最后一个问题,如果我想匹配一个没有点的字符串,并且在行的开头没有 api 子字符串(api 不在任何地方,但不仅在开头),该怎么办?
  • 要匹配行首的模式,您需要^ 锚点或(?m)^(^|\n)。所以你需要类似(^|\n)(?!api)[^.]*$
猜你喜欢
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
相关资源
最近更新 更多