【问题标题】:Parse multiple XML tags using regex使用正则表达式解析多个 XML 标签
【发布时间】:2011-11-13 07:40:41
【问题描述】:

我需要从 XML 中解析一些标签(它们的值)。这必须通过正则表达式完成(不要问我为什么:))

例如:

 <name>AAA</name>
 <id>1234</id>
 <gender>M</gender>

我知道使用正则表达式的每个标签所需的模式

string name =  "(?<=<name>).+?(?=</name>)";
string id = "(?<=<id>).+?(?=</id>)";
string gender = "(?<=<gender>).+?(?=</gender>)";

我只是不知道如何初始化 Regex 对象来处理所有这些。

我能做到:

private static readonly Regex rgx1 = new Regex(name);
private static readonly Regex rgx2 = new Regex(id);
private static readonly Regex rgx3r = new Regex(gender);

但我猜那是一种可怕的浪费......

所以我的问题是:如何初始化单个Regex 来处理多个模式?

一旦我做到了,如何从中提取值?

ps:如果有人需要知道的话,我正在用 C# 编程......

10 倍!

【问题讨论】:

  • 你为什么不使用 Xml 解析器呢?

标签: c# xml regex parsing


【解决方案1】:

你可以试试这个:

  string input = @" <name>AAA</name>
                                <id>1234</id>
                                <gender>M</gender>";
          string pattern = @"<name>(?<name>.+)</name>
                                <id>(?<id>.+)</id>
                                <gender>(?<gender>.+)</gender>";
          Match m = Regex.Match(input, pattern);
          Console.WriteLine(m.Groups["name"]);
          Console.WriteLine(m.Groups["id"]);
          Console.WriteLine(m.Groups["gender"]);

【讨论】:

    【解决方案2】:

    您不能指望回答此列表中问题的人会接受“不要问我为什么”作为约束条件。没有自尊的软件工程师会在不先询问原因的情况下接受使用错误设计来完成任务的要求。

    【讨论】:

      【解决方案3】:

      你说“不要问我为什么”,但恐怕我会援引程序员的特权问你为什么。如果不出意外,因为解决方案将根据实际问题的不同而有所不同。因此,例如,即使使用正则表达式,如果您采用 misha 的示例(假设它已修复以正确处理元素之间的空白),它只会在您发布的 XML 上完全工作。

      换句话说,像这样的 XML:

      <name>AAA</name>
      <id>1234</id>
      

      匹配失败。

      XML 的目的是允许对此类数据进行通用处理。现在可以确定,您可以修复正则表达式以确保它处理丢失的性别标签,但是如果您的实际案例比您的示例更复杂一点,那么您最终会得到一个非常复杂的正则表达式,并且确保其良好运行的责任将落在您身上。 (高质量的现代 XML 解析器经过高度调整以获得良好的性能。)

      所以你有它:要正确回答你的问题,我们需要知道实际问题,在这种情况下,诸如“你必须使用正则表达式”之类的约束是非常有趣的。

      例如,所讨论的 XML 实际上不是格式良好的 XML,因此 XML 解析器会遇到第一个障碍。知道这一点后,我们就可以质疑是否可以将问题分解为更简单的部分,例如首先提取格式良好的 XML 片段。

      可能还有其他原因,但无论原因是什么,这对解决方案至关重要。请分享。

      【讨论】:

      • 简而言之,原因是性能问题。我需要一个非常快速的代码,这就是为什么我被指示使用正则表达式
      • @Dardar 这可能是过早的优化吗?是否证明使用 XML 库会太慢?它是否已经过测试?
      • 我同意柯克的观点。在实践中,获得高性能代码的唯一方法是测量一个或多个实现的性能,并根据结果根据需要更改您的设计。虽然正则表达式可以非常快,但编写一个性能非常非常糟糕的正则表达式也很容易。当比赛的逻辑必须是一般的而不是具体的时尤其如此,并且你会得到很多回溯。另一方面,XML 解析器可以很好地执行。
      【解决方案4】:

      一个更通用解决方案,您甚至不必提前知道 XML 的标签:

      static void Main(string[] args)
          {
              string path = @"C:\TestFile.xml";
              string input = File.ReadAllText(path);
      
              string pattern = @"<(.*)>(.*)</\1>";
      
              foreach (Match m in Regex.Matches(input, pattern))
              {
                  System.Console.WriteLine(m.Groups[2].Value);
                  System.Console.WriteLine("\n");
              }
          }
      

      使用 (m.Groups[1].Value) 获取 XML Tag 的名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-22
        • 1970-01-01
        • 2018-01-15
        • 1970-01-01
        • 2012-01-25
        相关资源
        最近更新 更多