我们的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文本