如何使用正则表达式找到重复的字符串和它们之间的值?

时间:2009-07-22 19:17:22

标签: c# xml regex string

您如何使用正则表达式找到重复的字符串的值以及它之间的数据?例如,采用这段XML:

<tagName>Data between the tag</tagName>

找到这些值的正确正则表达式是什么? (注意tagName可以是任何东西)。

我找到了一种方法,可以查找位于一组tagName之间的所有< >,然后从开始标记中搜索tagName的第一个实例到字符串的末尾,然后找到结束</tagName>并计算它们之间的数据。然而,这非常效率低且复杂。必须有一个更简单的方法!

编辑:请不要告诉我使用XMLReader;我怀疑我是否会使用我的自定义类来阅读XML,我试图通过尝试自己来学习最好的方法(以及错误的方法)。

提前致谢。

5 个答案:

答案 0 :(得分:5)

您可以使用:<(\w+)>(.*?)<\/\1>

组#1是标签,组#2是内容。

答案 1 :(得分:3)

使用正则表达式解析XML是一个可怕的错误。

这很有效(它不会将XML解析为DOM)并且足够简单:

string s = "<tagName>Data between the tag</tagName>";

using (XmlReader xr = XmlReader.Create(new StringReader(s)))
{
    xr.Read();
    Console.WriteLine(xr.ReadElementContentAsString());
}

修改

由于这里的实际目标是通过实践来学习,而不是仅仅完成工作,这就是为什么使用正则表达式不起作用:

考虑这个相当简单的测试用例:

<a><b><a>text1<b>CDATA<![<a>text2</a>]]></b></a></b>text3</a>

该XML中有两个标记名为“a”的元素。第一个具有一个值为“text1”的文本节点子节点,第二个具有一个值为“text3”的文本节点子节点。此外,还有一个“b”元素,其中包含一个看起来像“a”元素的文本字符串,但不是因为它包含在CDATA部分中。

您无法使用简单的模式匹配来解析它。找到<a>并展望未来</a>并不会开始来做你需要的事情。您必须在找到它们时将开始标记放在堆栈上,并在到达匹配的结束标记时将它们从堆栈中弹出。当你遇到CDATA部分的开始时,你必须停止将任何东西放在堆栈上,并且在你遇到结束之前不要重新开始。

而且没有在问题中引入空格,空元素,属性,处理指令,注释或Unicode。

答案 2 :(得分:2)

您可以使用\1等反向引用来引用之前的匹配:

@"<([^>]*)>(.*)</\1>"

\1将匹配第一个带括号的组所捕获的内容。

答案 3 :(得分:0)

使用Perl:

my $tagName = 'some tag';
my $i; # some line of XML
$i =~ /\<$tagName\>(.+)\<\/$tagname\>/;

其中$ 1现在填充了您捕获的数据

答案 4 :(得分:0)

前进,如果你遇到困难,请查看regexlib.com

当我遇到正则表达式时,这是我去的第一个地方