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