相对路径正则表达式



我们的web应用程序允许用户指定自己的"slug",其中可以包括相对路径,例如/somedir/some-file.htm.

在我们的路由配置中,我们需要确保只支持有效的分段。

我使用的正则表达式是:

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

这意味着:

  • 有效的段塞将匹配,例如some-file.htm
  • 具有分段(相对路径)的有效段塞将匹配,例如somedir/subdr/some-file.htm
  • 绝对URL将不匹配,例如/somedir/some-file.htm
  • 拖尾/或-将不匹配,例如-段塞-

不幸的是,这也意味着双斜杠将匹配,例如somedir//subdir//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])?

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

然后它的其余部分是一个斜杠,后面又是同样的东西。

正如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])?)?$

编辑:

有一种想法认为,使用lookahead和behinds可以稍微简化一下。

^[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])$

注意:我在您的regexp中看不到.

就我个人而言,我会分别测试第一个和最后一个字符,这使得regexp更加简单和可用。

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

我的要求非常不同,所以我为其他来这里寻找答案的人回答,而不是回答这里发布的确切问题和要求。

我的要求:

  • 它需要与同一字符串中的多个路径匹配
  • 已知每条路径从./../开始
  • 它无法使用look-behinds,因为它们不受支持
  • 众所周知,每条路径都将在一条新线上
  • 文件夹总是使用单个/字符分隔

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

我的解决方案

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

我将以为例进行解释

/路径/to/file.ext lorem ipsum text

  • /..../g表示正则表达式将在同一字符串内多次匹配
  • ..?/.././都匹配

    /..?//g

    ../路径/到/file.ext lorem ipsum text

  • [^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文本

最新更新