1

我想拆分最多 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,此替换文本也会写入斜线。

4

2 回答 2

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任何流畅的方式注入该部分,我不完全确定如果没有适当的语言可以做到这一点。

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

鉴于这是 url 重写,坦率地说,我不确定是否有任何好的解决方案。您可以尝试使用自己的脚本文件来处理这个问题,然后只使用标头从那里重定向。我不是专家,我相信有人有更好的解决方案。

祝你好运。

于 2012-08-27T09:05:58.850 回答
0

找到了一种使用 .NET Group.Captures 属性的方法

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

输入网址:

/gfedcba.txt

重写网址:

/g/fe/dc/ba.txt

现在我要编写一个自定义的 IIS Url Rewrite Provider

于 2012-08-31T07:20:12.067 回答