C# 如何使用正则表达式查找重复字符串及其之间的值?

C# 如何使用正则表达式查找重复字符串及其之间的值?,c#,xml,regex,string,C#,Xml,Regex,String,您如何使用正则表达式找到重复的字符串的值及其之间的数据?例如,以这段XML为例: <tagName>Data between the tag</tagName> 标记之间的数据 找到这些值的正确正则表达式是什么?(注意,标记名可以是任何东西) 我找到了一种有效的方法,包括查找一组之间的所有标记名,然后从开始标记到字符串末尾搜索标记名的第一个实例,然后找到结束标记名,并从它们之间计算出数据。然而,这是非常低效和复杂的。一定有更简单的办法 编辑:请不要告诉我使用XMLRe

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

<tagName>Data between the tag</tagName>
标记之间的数据
找到这些值的正确正则表达式是什么?(注意,
标记名
可以是任何东西)

我找到了一种有效的方法,包括查找一组
之间的所有
标记名
,然后从开始标记到字符串末尾搜索
标记名的第一个实例,然后找到结束标记名
,并从它们之间计算出数据。然而,这是非常低效和复杂的。一定有更简单的办法

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

提前感谢。

使用Perl:

my $tagName = 'some tag';
my $i; # some line of XML
$i =~ /\<$tagName\>(.+)\<\/$tagname\>/;
my$tagName='some tag';
我的$i;#某行XML
$i=~/\(.+)\/;
其中$1现在填充了您用Perl捕获的数据:

my $tagName = 'some tag';
my $i; # some line of XML
$i =~ /\<$tagName\>(.+)\<\/$tagname\>/;
my$tagName='some tag';
我的$i;#某行XML
$i=~/\(.+)\/;
其中$1现在填充了您捕获的数据

您可以使用:
(.*)

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

您可以使用:
(.*)


Group#1是标记,Group#2是内容。

您可以使用类似
\1
的反向引用来引用早期匹配:

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

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

您可以使用类似
\1
的反向引用来引用先前的匹配:

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

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

使用正则表达式解析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());
}
string s=“标记之间的数据”;
使用(XmlReader xr=XmlReader.Create(新的StringReader)))
{
xr.Read();
Console.WriteLine(xr.ReadElementContentAsString());
}
编辑:

因为这里的实际目标是通过实践来学习,而不是仅仅完成工作,下面是使用正则表达式不起作用的原因:

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

<a><b><a>text1<b>CDATA<![<a>text2</a>]]></b></a></b>text3</a>
text1CDATAtext2]>text3
该XML中有两个标记名为“a”的元素。第一个有一个值为“text1”的文本节点子节点,第二个有一个值为“text3”的文本节点子节点。此外,还有一个“b”元素,它包含一个文本字符串,看起来像“a”元素,但实际上不是,因为它包含在CDATA节中

你不能用简单的模式匹配来解析它。查找
并展望
并不能满足您的需要。您必须在找到开始标记时将其放在堆栈上,并在到达匹配的结束标记时将其从堆栈中弹出。当遇到CDATA节的开头时,您必须停止在堆栈上放置任何内容,并且在遇到结尾之前不要重新开始


这并没有在问题中引入空格、空元素、属性、处理指令、注释或Unicode。

使用正则表达式解析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());
}
string s=“标记之间的数据”;
使用(XmlReader xr=XmlReader.Create(新的StringReader)))
{
xr.Read();
Console.WriteLine(xr.ReadElementContentAsString());
}
编辑:

因为这里的实际目标是通过实践来学习,而不是仅仅完成工作,下面是使用正则表达式不起作用的原因:

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

<a><b><a>text1<b>CDATA<![<a>text2</a>]]></b></a></b>text3</a>
text1CDATAtext2]>text3
该XML中有两个标记名为“a”的元素。第一个有一个值为“text1”的文本节点子节点,第二个有一个值为“text3”的文本节点子节点。此外,还有一个“b”元素,它包含一个文本字符串,看起来像“a”元素,但实际上不是,因为它包含在CDATA节中

你不能用简单的模式匹配来解析它。查找
并展望
并不能满足您的需要。您必须在找到开始标记时将其放在堆栈上,并在到达匹配的结束标记时将其从堆栈中弹出。当遇到CDATA节的开头时,您必须停止在堆栈上放置任何内容,并且在遇到结尾之前不要重新开始


这并没有在问题中引入空格、空元素、属性、处理指令、注释或Unicode。

如果遇到问题,请访问regexlib.com


这是我在regex上遇到麻烦时第一个去的地方,如果你遇到麻烦,请访问regexlib.com


当我被正则表达式卡住时,这是我第一个去的地方

我正在尝试制作自己的“XMLReader”。它不会快速/高效/可用,也不会被使用,但我认为人们应该尝试从头开始构建东西,而不是一直求助于API,这样他们至少知道它背后的想法以及他们创建的代码如此糟糕的原因。如果你不能在不使用.NET/Java/任何内置库的情况下进行快速乘法,甚至不能反转字符串,那么你真的是一名计算机科学家吗。也许不是。不过,关于正则表达式,您可能是对的。即便如此,我还是会尝试,然后失败,然后学习。我认为你不应该因为某人指出了实现某件事情的最佳方式而贬低他,仅仅因为你故意想用困难的方式来完成。当然,我只是觉得我必须解释我的行为,选择困难/失败的根源。我正在尝试制作自己的“XMLReader”。它不会快速/高效/可用,也永远不会