相对路径正则表达式

时间:2012-07-08 11:50:43

标签: regex

我们的网络应用程序允许用户指定他们自己的“slu”“,其中包括相对路径,例如/somedir/some-file.htm。

在我们的路由配置中,我们需要确保仅支持有效的段塞(带有段)。

我正在使用的正则表达式是:

(^[a-z0-9])([a-z0-9-/]+)([a-z0-9])$

这意味着:

  • 有效的slug将匹配,例如一些-file.htm
  • 带有段(相对路径)的有效段塞将匹配例如somedir /子目录/一些-file.htm
  • 绝对网址不匹配,例如/somedir/some-file.htm
  • 尾随/或 - 不匹配,例如-slug -

不幸的是,这也意味着双斜线将匹配,例如somedir // subdir // some-file.htm因为我的表达式允许一个或多个斜杠。

如何更改它以允许段之间有零个或多个斜杠。

我想:

(^[a-z0-9])(/?[a-z0-9-]+/?)([a-z0-9])$

会起作用,但事实并非如此。

4 个答案:

答案 0 :(得分:4)

^[a-z0-9]([a-z0-9-]*[a-z0-9])?(/[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$

编辑:如果你喜欢第一个正则表达式,请使用这个:

^(?!-)[a-z0-9-]+(?<!-)(/(?!-)[a-z0-9-]+(?<!-))*$

它显得凌乱而复杂,但根据您的规格似乎是正确的。

[a-z0-9]([a-z0-9-]*[a-z0-9])?

匹配单个名称。暂时忽略/

然后剩下的就是一个斜线,然后又是同样的东西。

正如Karoly的回答所提到的,这不包括文字句点,例如“some-file.htm”与我写的正则表达式不匹配。

如果这是期望的行为,那么你真的想要:

^[a-z0-9]([a-z0-9-\.]*[a-z0-9])?(/[a-z0-9]([a-z0-9-\.]*[a-z0-9])?)*$

最后,如果您只想在最后一部分中使用文字句点,那么您需要:

^[a-z0-9]([a-z0-9-]*[a-z0-9])?(/[a-z0-9]([a-z0-9-]*[a-z0-9])?)*(/[a-z0-9]([a-z0-9-\.]*[a-z0-9])?)?$

编辑:

一种想法是,使用前瞻和后面可以简化这一点。

^[a-z0-9]([a-z0-9-]*[a-z0-9])?(/[a-z0-9]([a-z0-9-]*[a-z0-9])?)*(/[a-z0-9]([a-z0-9-\.]*[a-z0-9])?)?$

变为:

^(?!-)[a-z0-9-]+(?<!-)(/(?!-)[a-z0-9-]+(?<!-))*(/(?!-\.)[a-z0-9-\.]+(?<!-\.))?$

答案 1 :(得分:1)

(^[a-z0-9]+)(/[a-z0-9-]+)*([a-z0-9])$

注意:我的正则表达式中没有.

我个人会单独测试第一个和最后一个字符,这使得正则表达式更简单,更实用。

答案 2 :(得分:0)

检查有效路径(相对或绝对。点是隐藏文件夹):
^([a-z]:)*(\/*(\.*[a-z0-9]+\/)*(\.*[a-z0-9]+))

答案 3 :(得分:0)

我的要求有很大的不同,所以我要为来这里寻求答案的其他人回答,而不是回答此处发布的确切问题和要求。

我的要求:

  • 它需要与同一字符串内的多个路径匹配
  • 已知每个路径都以./../开头
  • 由于不被支持,因此无法使用后退
  • 众所周知,每条路径都将在新的一行上
  • 文件夹始终使用单个/字符分隔。

这是我想出的(基于JS RegEx语法):

  

我的解决方案

     

/\.\.?\/[^\n"?:*<>|]+\.[A-z0-9]+/g

我将以此为例进行说明:

  

../ path / to / file.ext lorip ipsum文本

  • /..../g意味着正则表达式将在同一字符串内多次匹配
  • \.\.?\/匹配.././
      

    /\.\.?\//g

         

    ../ path / to / file.ext lorem ipsum文本

  • [^\n"?:*<>|]+是不匹配的字符的黑名单。
    • [^....] =与该字符列表不匹配。
    • \n =新行(路径永远不会出现在同一行)
    • 所有其他字符均为文字。它们是非法的文件名字符。
        

      /\.\.?\/[^\n"?:*<>|]+/g

           

      ../path/to/file.ext lorem ipsum text

  • \.[A-z0-9]+是为了确保它在文件扩展名的结尾处停止。
      

    /\.\.?\/[^\n"?:*<>|]+\.[A-z0-9]+/g

         

    ../path/to/file.ext lorem ipsum文本