разделить имя файла и объединить фрагменты в структуру каталогов

Я хочу разделить запрошенные фрагменты имени файла 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 не найдено, этот замещающий текст будет содержать косую черту.


person Martin Meixger    schedule 27.08.2012    source источник
comment
изменил вопрос - сделал более ясным, что я не хочу дважды совпадать с одним и тем же символом.   -  person Martin Meixger    schedule 29.08.2012


Ответы (2)


Вы не совсем ясны. Я попробовал это с предположением, что вы хотите сопоставить один и тот же символ дважды, если это возможно, в противном случае только один раз. Если это не так, шаблон становится немного сложнее, но вот пример того, как вы можете это сделать: 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-адресов, я не уверен, что есть какие-то хорошие решения, если честно. Вы можете попытаться справиться с этим с помощью своих собственных файлов сценариев, а затем просто использовать заголовки для перенаправления оттуда. Я не эксперт, я уверен, что у кого-то есть лучшее решение.

Удачи.

person Firas Dib    schedule 27.08.2012

нашел способ, используя свойство .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:

входной URL:

/gfedcba.txt

переписанный URL:

/g/fe/dc/ba.txt

теперь я собираюсь написать пользовательский поставщик перезаписи URL-адресов IIS

person Martin Meixger    schedule 31.08.2012