正则表达式允许你解析字符串吗?如果是这样,怎么样?

时间:2010-07-20 12:19:53

标签: c# 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+"

我当时可以自己解决剩下的问题。

感谢。

4 个答案:

答案 0 :(得分: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'.

答案 1 :(得分: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();

答案 2 :(得分:0)

尝试一下:

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

答案 3 :(得分: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"]);
}