2016-07-29 179 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

好,謝謝你! –