0

如何提取 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'被抓住。

4

2 回答 2

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()

于 2012-11-15T14:16:41.493 回答
0
var allMatches = Regex.Matches(text, @"(frame.*push ')(.*?)(?='.*end)", RegexOptions.Singleline);

foreach (Match matches in allMatches)
{
    String somexml = matches.Groups[2].Value;
}
于 2012-11-15T12:50:54.090 回答