2012-03-28 2 views
0

Я работаю над строчными маннигалами с использованием регулярных выражений.Как использовать класс regex для связывания строк

Source: string value = @"/webdav/MyPublication/Building%20Blocks/folder0/folder1/content_1.xml"; 

    output required: 
      Foldername: folder1 
      content name: content 
      folderpath:/webdav/MyPublication/Building%20Blocks/folder0/folder1/ 

Я новичок в этом, каждый может сказать, как это можно сделать с помощью регулярного выражения. Спасибо.

+0

Не могли бы вы описать правила, которые вы хотите использовать в словах? Пример можно интерпретировать по-разному. Кроме того, что вы пробовали? – svick

+3

Класс «Путь», вероятно, будет полезен. –

ответ

0

правила, которые нужно, как представляется, следующее:

  • Имя папки = последней строки, предшествовавшего «/» характер, но не содержащий символ «/»
  • имя контента = последняя строка, не содержащая '/' до (но не включая) a '_' или '.' характер
  • путь_к_папке = так же, как имя папки, за исключением того, что может содержать «/» характер

Предполагая, что правила выше - вы, вероятно, хотите этот код:

string value = @"/webdav/MyPublication/Building%20Blocks/folder0/folder1/content_1.xml"; 

var foldernameMatch = Regex.Match(value, @"([^/]+)/[^/]+$"); 
var contentnameMatch = Regex.Match(value, @"([^/_\.]+)[_\.][^/]*$"); 
var folderpathMatch = Regex.Match(value, @"(.*/)[^/]*$"); 
if (foldernameMatch.Success && contentnameMatch.Success && folderpathMatch.Success) 
{ 
    var foldername = foldernameMatch.Groups[1].Value; 
    var contentname = contentnameMatch.Groups[1].Value; 
    var folderpath = folderpathMatch.Groups[1].Value; 
} 
else 
{ 
    // handle bad input 
} 

Обратите внимание, что вы можете также комбинировать эти чтобы стать один большой регулярное выражение, хотя это может быть более громоздким, чтобы следовать (если это не было уже):

var matches = Regex.Match(value, @"(.*/)([^/]+)/([^/_\.]+)[_\.][^/]*$"); 
if (matches.Success) 
{ 
    var foldername = matches.Groups[2].Value; 
    var contentname = matches.Groups[3].Value; 
    var folderpath = matches.Groups[1].Value + foldername + "/"; 
} 
else 
{ 
    // handle bad input 
} 
+0

Спасибо, Пинни. Содержимое может содержать или не содержать «_». Если он содержит, мне нужно удалить его, или же нужно взять имя как есть. – Patan

+0

Если он не содержит подчеркивания - например, 'content.xml' вам нужно взять все имя или до '.' персонаж? – PinnyM

+0

есть. Я хочу взять до ». charecter. – Patan

0

Вы можете использовать named captures, но вам, вероятно, лучше (с точки зрения безопасности и реализации), используя Uri class.

0

Я согласен с Джеффом Moser на этом, а к ответьте на исходный вопрос, я считаю, что следующее регулярное выражение будет работать: ^(\/.+\/)(.+?)\/(.+?)\.

Редактировать: Добавлено пример.

var value = "/webdav/MyPublication/Building%20Blocks/folder0/folder1/content_1.xml"; 
var regex = Regex.Match(value, @"^(\/.+\/)(.+?)\/(.+?)\."); 

// check if success 
if (regex.Success) 
{ 
    // asssign the values from the regular expression 
    var folderName = regex.Groups[2].Value; 
    var contentName = regex.Groups[3].Value; 
    var folderPath = regex.Groups[1].Value; 
}