我需要从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
来处理多种模式?
一旦我做了,如何从中提取值?
p.s:如果有人需要知道,我正在使用C#进行编程....
10x很多!
答案 0 :(得分:3)
你不能指望那个在这个清单上回答问题的人接受“不要问我为什么”作为约束。在没有事先询问原因的情况下,任何自尊心的软件工程师都不会接受使用错误设计的要求。
答案 1 :(得分:2)
你说“不要问我为什么”,但我担心我会调用程序员的特权并问你为什么。如果不出意外,因为解决方案会根据实际问题而有所不同。因此,例如,即使使用正则表达式,如果你采用misha的例子(假设它被修复以正确处理元素之间的空白),它只能在完全你发布的XML上工作。
换句话说,使用这样的XML:
<name>AAA</name>
<id>1234</id>
比赛失败。
XML的目的是允许对这种数据进行通用处理。现在可以肯定的是,您可以修复正则表达式以确保它处理缺少的性别标记,但如果您的真实案例甚至比您的示例更复杂,那么您最终会得到一个非常复杂的正则表达式,并且确保其表现良好的责任将落在你身上。 (高质量的现代XML解析器经过高度优化以获得良好的性能。)
所以你有它:正确地回答你的问题,我们需要知道实际问题,在这种情况下,诸如“你必须使用正则表达式”这样的约束非常有趣。
比如说,所讨论的XML实际上并不是格式良好的XML,因此XML解析器将处于第一个障碍。了解这一点将使我们能够质疑问题是否可以分解为更简单的部分,例如首先提取格式良好的XML片段。
可能还有其他原因,但无论原因是什么,这对解决方案至关重要。请分享。
答案 2 :(得分:1)
更多通用解决方案,您甚至不必提前知道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标记的名称。