【问题标题】:split a filename and join chunks to directory structure拆分文件名并将块连接到目录结构
【发布时间】:2012-08-31 15:20:12
【问题描述】:

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

输入(逐行):

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,此替换文本也会写入斜线。

【问题讨论】:

  • 更改了问题 - 更清楚地说,我不想匹配同一个字符两次。

标签: .net regex iis url-rewriting


【解决方案1】:

你并不完全清楚。我假设您希望尽可能匹配同一个字符两次,否则只匹配一次。如果不是这种情况,模式会变得有点复杂,但这里有一个例子说明如何做到这一点: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 重写,坦率地说,我不确定是否有任何好的解决方案。您可以尝试使用自己的脚本文件来处理这个问题,然后只使用标头从那里重定向。我不是专家,我相信有人有更好的解决方案。

祝你好运。

【讨论】:

    【解决方案2】:

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

    LinqPad sn-p:

    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

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

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 2016-10-03
      • 2016-12-20
      • 2020-05-31
      • 2013-12-15
      • 2017-04-17
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      相关资源
      最近更新 更多