您如何使用正则表达式找到重复的字符串的值以及它之间的数据?例如,采用这段XML:
<tagName>Data between the tag</tagName>
找到这些值的正确正则表达式是什么? (注意tagName
可以是任何东西)。
我找到了一种方法,可以查找位于一组tagName
之间的所有< >
,然后从开始标记中搜索tagName
的第一个实例到字符串的末尾,然后找到结束</tagName>
并计算它们之间的数据。然而,这非常效率低且复杂。必须有一个更简单的方法!
提前致谢。
答案 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
当我遇到正则表达式时,这是我去的第一个地方