2009-11-18 67 views
2

我試圖匹配沒有文件夾字符(/)或以擴展名(.aspx)結尾的URL的任何請求。現在,我可以忽略正則表達式中的查詢字符串值和片段。到目前爲止,我有以下幾點。沒有最終字符的正則表達式匹配

^([\w-/]+)(?!\.aspx|/)$ 

但是,如果我運行這個表達式,它選擇了我不希望它做的最後一個/組。目標是將.aspx附加到沒有使用Isapi ReWrite指定的網址,然後將請求轉發到.NET引擎。

下面的例子中示出了以粗體

asd.aspx

something.aspx
這個/測試/(不想要的最終/在當前匹配的所有字符)
this-test/(不想要最後的/)
這個測試
這個測試/是/測試

任何人都可以表明,不會選擇最後的/如果表達式中發現的一種表達?

+0

也許你正在試圖用正則表達式做太多? – 2009-11-18 10:04:05

+0

你的第一句話是錯的,或者你的正則表達式和例子是錯誤的。你想匹配最後沒有斜槓或.aspx的所有字符串嗎? – 2009-11-18 15:47:21

回答

4

嘗試向後看斷言:

^([\w-/]+)(?<!/|\.aspx)$ 
+0

感謝的Gumbo工作完美 – WDuffy 2009-11-18 11:05:56

+0

我想你的正則表達式引擎允許可變寬度的後視斷言呢? – 2009-11-18 15:45:32

+0

@Douglas Leeder:後視有一個固定的寬度:一個或五個字符。可變寬度將允許像'*'或'+'這樣的無限上限。 – Gumbo 2009-11-18 16:33:59

1

移動的/基團()以外:

^([\w-/]+)(?!\.aspx)/?$ 
+1

不會/ /?永遠不會匹配,因爲貪婪+總會接受它? – 2009-11-18 10:02:33

+0

前瞻斷言'(?!\。aspx)'因爲它沒有在字符串末尾。 – Gumbo 2009-11-18 10:08:37

+1

這是一個負面的前瞻斷言 - 我看不出最終的/?將永遠匹配任何東西(即它將始終是{0,1}的0)。 – 2009-11-18 10:17:15

0

從正則表達式刪除/和外添加它,並指定其可具有0或1的發生。

^([\ w - /] +)(ASPX?!)(/){0,1} $

+0

?是{0,1}的簡寫形式,並且沒有必要將最後的/ – Kimvais 2009-11-18 09:35:01

+0

組合在一起,但是我沒有看到?在你的回答之前,可能會想念那個。 – 2009-11-18 09:59:51

1

你的第一句話與您的正則表達式或示例不符。
在我看來,你想:

  1. 如果字符串以.aspx結束不進一步處理。
  2. 否則,如果字符串以/結尾,請刪除該斜槓。
  3. 處理字符串。

也許你試圖用正則表達式做太多?

爲什麼不明確測試你的擴展名(.aspx),如果你沒有,那麼檢測一個終結斜槓並將其刪除,然後再進行額外的字符串處理?

也就是說:我相信可以創建一個正向表達式,並帶有負向預測,這樣做會明顯做得更清楚。

您還可能希望測試一些更多的例子:

foo/bar/.aspx 
foo/bar.aspx/ 
foo.aspx/bar 
foo.aspx/bar/ 

只是要確保你知道你期待什麼作爲輸出。

+0

我檢查了你提供道格拉斯的例子,幸好它們不匹配使用Gumbo提供的正則表達式。好的想法,雖然+1。 – WDuffy 2009-11-18 11:09:41

+0

那你的第一個錯誤是不對的? – 2009-11-18 15:46:27