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

时间:2012-08-27 07:20:21

标签: .net regex iis url-rewriting

我想拆分最多2个字符的请求的url文件名块,然后重写为目录结构:

输入(逐行):

a.txt
ba.txt
cba.txt
dcba.txt
edcba.txt
fedcba.txt
gfedcba.txt
hgfedcba.txt

期望的输出:

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/file.txt
///ba/file.txt
//c/ba/file.txt
//dc/ba/file.txt
/e/dc/ba/file.txt
/fe/dc/ba/file.txt
g/fe/dc/ba/file.txt
hg/fe/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,此替换文本也会写入斜杠。

2 个答案:

答案 0 :(得分:0)

你还不完全清楚。我假设您希望在可能的情况下两次匹配相同的字符,否则只需一次。如果不是这种情况,那么模式会变得有点复杂,但这里有一个如何做到这一点的例子:http://regex101.com/r/nG4tZ9

/^|\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部分,如果没有适当的语言,我不能完全确定它是可能的。

除了我用正则表达式提供的内容之外,我不建议你做任何事情。我会为它写一个小函数。

看到这是网址重写,我不确定有什么好的解决方案可以坦率地说。您可以尝试使用自己的脚本文件处理此问题,然后只使用标头从那里重定向。我不是专家,我相信有人有更好的解决方案。

祝你好运。

答案 1 :(得分:0)

找到了一种使用.NET Group.Captures Property

的方法

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输出:

  

inputUrl:

     

/gfedcba.txt

     

rewrittenUrl:

     

/g/fe/dc/ba.txt

现在我要写一个custom IIS Url Rewrite Provider