Позволяет ли регулярное выражение анализировать строки? Если так, то как? - PullRequest
3 голосов
/ 20 июля 2010

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

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

-----------------------------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+"

Тогда я, вероятно, сам смогу решить все остальное.* Спасибо.

Ответы [ 4 ]

4 голосов
/ 20 июля 2010

Именованные подходящие подвыражения - это то, что лучше всего соответствует вашим потребностям.(?<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'.
2 голосов
/ 20 июля 2010

Используя Именованные группы захвата , вы сможете анализировать практически все, а затем обращаться к нему по имени.

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 голосов
/ 20 июля 2010

Я думаю, что вы ищете Группирующие конструкции , которые позволяют вам извлекать части регулярного выражения. Итак, используя ваш упрощенный пример:

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"]);
}
0 голосов
/ 20 июля 2010

Попробуйте:

(?<=filename\=\").*(?=\")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...