.net 拆分文件名并将块连接到目录结构
我想将请求的url文件名拆分为最多2个字符的块,然后重写为目录结构: 输入(逐行): 期望输出:.net 拆分文件名并将块连接到目录结构,.net,regex,iis,url-rewriting,.net,Regex,Iis,Url Rewriting,我想将请求的url文件名拆分为最多2个字符的块,然后重写为目录结构: 输入(逐行): 期望输出: a/file.txt ba/file.txt c/ba/file.txt dc/ba/file.txt e/dc/ba/file.txt fe/dc/ba/file.txt g/ef/dc/ba/file.txt hg/ef/dc/ba/file.txt 已实现的输出(使用以下正则表达式): 正则表达式: ([a-z]{1,2}?)??([a-z]{1,2}?)??([a-z]{1,2}?)??(
a/file.txt
ba/file.txt
c/ba/file.txt
dc/ba/file.txt
e/dc/ba/file.txt
fe/dc/ba/file.txt
g/ef/dc/ba/file.txt
hg/ef/dc/ba/file.txt
已实现的输出(使用以下正则表达式):
正则表达式:
([a-z]{1,2}?)??([a-z]{1,2}?)??([a-z]{1,2}?)??([a-z]{1,2})??\.txt
替换:
$1/$2/$3/$4/file.txt
我没有办法重复匹配并捕获每个迭代
不幸的是,即使未找到匹配的$1-$3,此替换文本也会写入斜杠。您还不完全清楚。我假设你想匹配同一个角色两次,如果可能的话,否则只匹配一次。如果不是这样的话,模式会变得更复杂一些,但下面是一个如何实现的示例:
/^|\G([a-z])\2?/gm
将此用作替换:\1/
这将产生以下结果:
/a/.txt
/aa/.txt
/b/aa/.txt
/bb/aa/.txt
/c/bb/aa/.txt
/cc/bb/aa/.txt
/d/cc/bb/aa/.txt
/dd/cc/bb/aa/.txt
我不确定如何以任何平滑的方式注入file.txt
部分,如果没有合适的语言,我不完全确定这是否可能
我不建议您做任何超出我所介绍的正则表达式之外的事情。我会为它编写一个小函数
鉴于这是url重写,坦率地说,我不确定有什么好的解决方案。您可以尝试使用自己的脚本文件来处理这个问题,然后使用头文件从那里重定向。我不是专家,我相信有人有更好的解决办法
祝你好运。找到了使用.NET的方法
LinqPad代码段:
string inputUrl= "/gfedcba.txt";
string pattern = @"/([a-z]{1,2})+\.txt";
string rewrittenUrl = inputUrl;
Match match = Regex.Match(inputUrl, pattern, RegexOptions.RightToLeft);
if(match.Success){
var captures = match.Groups[1].Captures;
rewrittenUrl="";
for(int i = captures.Count; i > 0; i--) {
rewrittenUrl += "/" + captures[i-1].Value;
}
rewrittenUrl += ".txt";
}
"inputUrl:".Dump();
inputUrl.Dump();
"rewrittenUrl:".Dump();
rewrittenUrl.Dump();
LinqPad输出:
输入URL:
/gfedcba.txt
重写URL:
/g/fe/dc/ba.txt
现在我要写一个修改过的问题——更清楚地说,我不想两次匹配同一个字符。
/a/.txt
/aa/.txt
/b/aa/.txt
/bb/aa/.txt
/c/bb/aa/.txt
/cc/bb/aa/.txt
/d/cc/bb/aa/.txt
/dd/cc/bb/aa/.txt
string inputUrl= "/gfedcba.txt";
string pattern = @"/([a-z]{1,2})+\.txt";
string rewrittenUrl = inputUrl;
Match match = Regex.Match(inputUrl, pattern, RegexOptions.RightToLeft);
if(match.Success){
var captures = match.Groups[1].Captures;
rewrittenUrl="";
for(int i = captures.Count; i > 0; i--) {
rewrittenUrl += "/" + captures[i-1].Value;
}
rewrittenUrl += ".txt";
}
"inputUrl:".Dump();
inputUrl.Dump();
"rewrittenUrl:".Dump();
rewrittenUrl.Dump();