Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 拆分文件名并将块连接到目录结构_.net_Regex_Iis_Url Rewriting - Fatal编程技术网

.net 拆分文件名并将块连接到目录结构

.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}?)??(

我想将请求的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-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();