我过去曾使用正则表达式进行输入验证,但我想知道它们是否可以让你解析一个复杂的字符串。
我有这样的标题:
-----------------------------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 :(得分: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"]);
}