2011-09-15 84 views
0

我有一个字符串,基本上是一个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#获取每个事件?

+1

为什么不仅仅像解析XML一样解析XML? – BoltClock

+0

尝试使用懒惰修饰符 - “\”[\\ w] *?\“”。 –

回答

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); 
} 

这是略有哈克,但它比试图伪装XML解析自己更好。

+0

谢谢!!!我同意创建我自己的解析器是一个不好的主意,但我无法尝试使用XML API。但是一个小调整;由于“foreach不能在方法组上运行...”错误,我不得不将元素的属性添加到()。再次谢谢你! –

+0

@William:哎呀,谢谢,修正了代码。 –

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\">"; 
1

要真正回答你的问题,您应该pattern可能是因为​​将\w不匹配空格,符号等。

相关问题