将xml解压缩为两个字符串之间的字符串

时间:2012-11-15 11:40:52

标签: c# .net regex

如何提取someXml?

frame 0
    push 'this'
    getVariable
    push 'g_data_1343488'
    push ' 

    someXml'

    setMember
end // of frame 0

我正在尝试使用RegEx,但我没有成功:

foreach (var match in Regex.Matches(file, @"(?<=push ').*(?=')"))

这一个的问题:我不想让例如'g_data_1343488'或'this'被抓住。

2 个答案:

答案 0 :(得分:1)

这是一种可能性。它是一个正则表达式,试图将单引号之间的内容识别为XML。它不是一个完美的正则表达式。如果可以使用,这实际上取决于您的要求。正则表达式越准确,读取就越困难。实际上,这个表达式将不匹配所有XML,并且也会匹配一些无效的XML。

例如,此正则表达式将匹配具有以数字开头的名称的标记。它还会将XML结束标记与属性进行匹配。您可以根据需要调整它。

这是:

push\s+'\s*<(\w+)(?:\s+\w+=(?:"[^"]*"|'[^']*'))*>(?:[^<]+|(?!</\1>)</?\w+(?:\s+\w+=(?:"[^"]*"|'[^']*'))*\s*/?>)*</\1>\s*'

以下是表达式的细分。 push语句的开头:

push\s+'\s*

检测根XML标记并捕获其名称。允许使用单引号和双引号分隔的属性。:

<(\w+)(?:\s+\w+=(?:"[^"]*"|'[^']*'))*>

遍历根标记内的所有内部标记和文本元素。允许使用单引号和双引号分隔的属性。

(?:[^<]+|(?!</\1>)</?\w+(?:\s+\w+=(?:"[^"]*"|'[^']*'))*\s*/?>)*

捕获结束根标记。

</\1>\s*'

您还可以尝试简单地捕获推送命令并通过此解决方案中的函数运行其值: How to check for valid xml in string input before calling .LoadXml()

答案 1 :(得分:0)

var allMatches = Regex.Matches(text, @"(frame.*push ')(.*?)(?='.*end)", RegexOptions.Singleline);

foreach (Match matches in allMatches)
{
    String somexml = matches.Groups[2].Value;
}