2010-07-20 5 views
3

Я использовал regex в прошлом для проверки ввода, но мне интересно, могут ли они позволить вам разобрать сложную строку.Может ли регулярное выражение анализировать строки? Если да, то как?

У меня есть заголовок, как это:

-----------------------------7dac1d2214d4\r\nContent-Disposition: form-data; name=\"my_title\"\r\n\r\nMyData\r\n-----------------------------7dac1d2214d4\r\nContent-Disposition: form-data; name=\"myupload\"; filename=\"C:\\myfile.zip\"\r\nContent-Type: application/x-zip-compressed\r\n\r\n 

Я хочу, чтобы иметь возможность разобрать скажем, имя файла.

На данный момент я делаю это (после разбора заголовков):

this.FileName = headers[1].Substring(headers[1].IndexOf("filename=\"") + "filename=\"".Length, headers[1].IndexOf("\"\r\n", headers[1].IndexOf("filename=\"")) - (headers[1].IndexOf("filename=\"") + "filename=\"".Length)); 

Но это отвратительное и уродливое.

Может ли регулярное выражение решить эту проблему более изящно? Я понимаю, основы синтаксиса, так что если он может решить, кто-то может показать мне, как разобрать это с регулярным выражением:

"+Name=Bob+Age=39+" 

Я, вероятно, может работать все остальное сам потом.

Спасибо.

+0

Разбор во что? Какой синтаксический анализ вам нужен? – Oded

+0

Я хочу, чтобы иметь возможность анализировать различные свойства, такие как filename – NibblyPig

+0

Я действительно думаю, что вы должны были принять ответ Дэниела, считая, что он был первым. – Josh

ответ

2

Named Capturing Groups Использование вы должны быть в состоянии разобрать только о чем-нибудь, а потом обратиться к нему по имени.

var inputString = "+Name=Bob+Age=39+"; 
var regex = new Regex("Name=(?<Name>[A-Z][a-z]*)\\+Age=(?<Age>[0-9]*)"); 

var match = regex.Match(inputString); 

System.Console.WriteLine("Name: {0}", match.Groups["Name"]); 
System.Console.WriteLine("Age: {0}", match.Groups["Age"]); 

System.Console.ReadKey(); 
+0

Прохладный, не могли бы вы объяснить, как вы разделите два поиска? Вы используете \\ +, это что-то представляет? Поиск этого регулярного выражения по порядку? – NibblyPig

+0

«\\» - это просто escape-последовательность. «+» - особый символ в значении Реджекса (по крайней мере один символ). Для того, чтобы лечить его буквально, я должен был избежать этого. Поскольку «\» указывает escape-последовательность в строках C#, мне пришлось сбежать из этого с другим «\» :) Очистить как грязь? – Josh

+0

Да, порядок важен в этом конкретном регулярном выражении. Помните, что Regex - это в основном сканер; как и компилятор. Есть такие вещи, как обратное отслеживание и обратные ссылки, но по большей части программы регулярного выражения сканируют слева направо. – Josh

4

Named matched subexpressions подходит именно вам. (?<Name>Expression) позволяет получить доступ к строке, соответствующей выражению Expression через указанное имя группы Name.

var input = "Foo=42;Bar='FooBar'"; 

var regex = new Regex(@"Foo=(?<Foo>[0-9]+);Bar='(?<Bar>[^']+)'"); 

var match = regex.Match(input); 

Console.WriteLine(match.Groups["Foo"]); // Prints '42'. 
Console.WriteLine(match.Groups["Bar"]); // Prints 'FooBar'. 
+0

Проклятия, которые вы избили меня до него :) Приятно видеть кого-то из рядовых Regex ninja – Josh

+0

Я поражен тем, насколько похожи два ответа: :) –

0

Дайте этому попытку:

(?<=filename\=\").*(?=\") 
0

Я думаю, что вы ищете являются Grouping Constructs, которые позволяют извлекать части регулярных выражений. Так, используя упрощенный пример:

string input = @"+Name=Bob+Age=39+"; 
Regex regex = new Regex(@"Name=(?<Name>[^\+]+)\+Age=(?<Age>[^\+]+)"); 

foreach (Match match in regex.Matches(input)) 
{ 
    Console.WriteLine("Name = '{0}'", match.Groups["Name"]); 
    Console.WriteLine("Age = '{0}'", match.Groups["Age"]); 
}