我们的网络应用程序允许用户指定他们自己的“slu”“,其中包括相对路径,例如/somedir/some-file.htm。
在我们的路由配置中,我们需要确保仅支持有效的段塞(带有段)。
我正在使用的正则表达式是:
(^[a-z0-9])([a-z0-9-/]+)([a-z0-9])$
这意味着:
不幸的是,这也意味着双斜线将匹配,例如somedir // subdir // some-file.htm因为我的表达式允许一个或多个斜杠。
如何更改它以允许段之间有零个或多个斜杠。
我想:
(^[a-z0-9])(/?[a-z0-9-]+/?)([a-z0-9])$
会起作用,但事实并非如此。
答案 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文本