正则表达式:URL重写任何没有扩展名的路径

时间:2013-01-31 06:10:15

标签: java regex url-rewriting

我写了一个正则表达式,它“适用于”我能想到的所有测试用例。 基本上任何匹配模式的URL:

/app.* AND没有长度为1-4的扩展名,应该重写。 我想出来了:

/app((?:\\/[\\w([^\\..]{1,4}\b)\\-]+)+)

问题是,这可以简化以达到同样的目的吗? 另外,我可以用。*之类的东西替换我对\ w的使用,我可能是错的,但我怀疑只要遇到一个带有奇怪字符的URL就会中断。

编辑1: 应匹配的示例网址:

/app AND /app/
/app/auth
/app/auth/fb
/app/auth/twitter
/app/groups
/app/conn/manage
/app/play
/app/play/migrate
/app/play/migrate/done

不匹配的示例网址:

/app/js/some.file.js
/app/js/jquery.js
/app/styles/default/rain.css
/app/styles/name/file.css
/app/tpl/index.tpl
/app/tpl/file.html
/app/tpl/some.other.tpl

感谢。

2 个答案:

答案 0 :(得分:2)

我认为更好的方法是将您希望Web服务器的所有资产放在一个目录中。与/app/public一样,您可以获得app/public/jsapp/public/html等。这将使您没有边缘情况并且更容易处理URL。

无论如何,我认为下面的正则表达式回答了你问的问题:匹配任何东西,除非文件中有1到4个字符的扩展名。

^(\/(\w+))*\/?(\.\w{5,})?\??([^.]+)?$

http://rubular.com/r/4CQ4amccH5

^              //start of anchor
  (
    \/         //match forward slash
    (\w+)      //match any word character, match atleast once 
  )+           //match this group atleast once (this group captures /app/etc/etc)
  \/?          //match a forward slash, make it optional (to also capture /app/)
  (\.\w{5,})?  //match any word after a . with 5 characters or more, make it optional
  \??          //match a ?, make the match optional
  ([^.]+)?     //match anything not containing a . 1 or more times, make the match optional
$              //end of anchor

这仍然需要一些工作才能使它在Java中工作,主要是很多转义转义字符。

答案 1 :(得分:0)

你的正则表达式是:

/app(/\w+)*/?$

我认为你想要将一个url与单词字符匹配,这些单词字符可能以斜杠结尾但不是文件扩展名。