【问题标题】:Extract xml as string between two strings将xml提取为两个字符串之间的字符串
【发布时间】:2012-11-15 11:40:52
【问题描述】:

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

【问题讨论】:

  • 所以你想要最后一个'push'和'setMember'之间的文本?
  • 是的!我想获取 someXml(而不是 someXml')

标签: c# .net regex


【解决方案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()

【讨论】:

    【解决方案2】:
    var allMatches = Regex.Matches(text, @"(frame.*push ')(.*?)(?='.*end)", RegexOptions.Singleline);
    
    foreach (Match matches in allMatches)
    {
        String somexml = matches.Groups[2].Value;
    }
    

    【讨论】:

    • 附言。如果我们将第一组放在 ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 2019-10-10
    • 2020-10-15
    • 1970-01-01
    相关资源
    最近更新 更多