使用正则表达式在引号之间获取字符串

时间:2011-09-15 21:27:26

标签: c# regex

我有一个基本上是XML节点的字符串,我需要提取属性的值。我正在尝试使用以下C#代码来实现此目的:

string line = "<log description="Reset Controls - MFB - SkipSegment = True" start="09/13/2011 10:29:58" end="09/13/2011 10:29:58" timeMS="0" serviceCalls="0">"
string pattern = "\"[\\w ]*\"";
Regex r = new Regex(pattern);

foreach (Match m in Regex.Matches(line, pattern))
{
    MessageBox.Show(m.Value.Substring(1, m.Value.Length - 2));
}

问题是,这只会返回字符串中的最后一次出现(上例中为“0”),此时每个字符串包含5次出现。如何使用C#获取每次事件?

3 个答案:

答案 0 :(得分:6)

不要尝试使用正则表达式解析XML。请改用XML API。试图破解“足够的XML解析器”只是一个非常糟糕的想法 - 你最终会得到令人难以置信的脆弱代码。

现在你的行实际上实际上是一个有效的XML元素 - 但是如果你添加一个</log>它将是。

XElement element = XElement.Parse(line + "</log>");
foreach (XAttribute attribute in element.Attributes())
{
    Console.WriteLine("{0} = {1}", attribute.Name, attribute.Value);
}

那是稍微 hacky,但它比自己伪造XML解析更好。

答案 1 :(得分:1)

顺便说一句,你需要为双引号转义字符串并添加一个分号:

string line = "<log description=\"Reset Controls - MFB - SkipSegment = True\" start=\"09/13/2011 10:29:58\" end=\"09/13/2011 10:29:58\" timeMS=\"0\" serviceCalls=\"0\">";

答案 2 :(得分:1)

要真实回答您的问题,您的pattern应该是"\"[^\"]*\"",因为\w与空格,符号等不匹配。