Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用正则表达式C替换多个实例#_C# - Fatal编程技术网

C# 如何使用正则表达式C替换多个实例#

C# 如何使用正则表达式C替换多个实例#,c#,C#,我正在尝试从lsec复制UID属性,并替换所有后续的sbsecloc和sbsecanchor属性 Input ------------------------------------------------ <lsec uid='copy_1' d='1' n='' anchor='1'> <name>Normal Text</name> <p>Normal Text <lsbsec d='1' sbsecloc='(1)' sbsecanc

我正在尝试从lsec复制UID属性,并替换所有后续的sbseclocsbsecanchor属性

Input
------------------------------------------------
<lsec uid='copy_1' d='1' n='' anchor='1'>
<name>Normal Text</name>
<p>Normal Text
<lsbsec d='1' sbsecloc='(1)' sbsecanchor='(1)'>
<p>Normat Text</lsbsec>
<lsbsec d='2' sbsecloc='(2)' sbsecanchor='(2)'>
<p>Normat Text</lsbsec>
<lsbsec d='3' sbsecloc='(3)' sbsecanchor='(3)'>
<p>Normat Text</lsbsec>
<lsbsec d='4' sbsecloc='(4)' sbsecanchor='(4)'>
<p>Normat Text</lsbsec>
</lsec>

Output
------------------------------------------------
<lsec uid='copy_1' d='1' n='' anchor='1'>
<name>Normal Text</name>
<p>Normal Text
<lsbsec d='1' sbsecloc='copy_1(1)' sbsecanchor='copy_1(1)'>
<p>Normat Text</lsbsec>
<lsbsec d='2' sbsecloc='copy_1(2)' sbsecanchor='copy_1(2)'>
<p>Normat Text</lsbsec>
<lsbsec d='3' sbsecloc='copy_1(3)' sbsecanchor='copy_1(3)'>
<p>Normat Text</lsbsec>
<lsbsec d='4' sbsecloc='copy_1(4)' sbsecanchor='copy_1(4)'>
<p>Normat Text</lsbsec>
</lsec>
输入
------------------------------------------------
普通文本
普通文本
标准文本
标准文本
标准文本
标准文本
输出
------------------------------------------------
普通文本
普通文本
标准文本
标准文本
标准文本
标准文本
我使用foreach循环来生成输出,它工作得很好,但是当处理超过100页的数据和要替换的多个实例时,它需要更多的时间

textBox8.Text = Regex.Replace(textBox8.Text, @"\t|\n|\r", "");
 foreach (int lines in textBox8.Text)
        {
            textBox8.Text = Regex.Replace(textBox8.Text, "<lsec uid='(.*)' d='(.*)' (.*) anchor='(.*)'>(.*)<lsbsec d='(.*)' sbsecloc='(.*)' sbsecanchor='(.*)'>", "<lsec uid='$1' d='$2' $3 anchor='$4'>$5<lsbsec d='$6' loc='$1$7' anchor='$1$8'>");
        }
textBox8.Text=Regex.Replace(textBox8.Text,@“\t\n\r”,”);
foreach(textBox8.Text中的int行)
{
textBox8.Text=Regex.Replace(textBox8.Text,“(.*”,“$5”);
}
上面的代码首先替换最后一个实例(sbsecloc|sbsecanchor


有更好的替换方法吗?

首先,当您处理大量数据时,无论您做什么,都会遇到速度减慢的问题

然而,你真正的问题是,你试图把一个方形的钉子装进一个圆孔里正则表达式无法处理SGML及其衍生物的所有异常情况和边缘情况。


您应该做的是使用XML解析器。
System.Xml.Linq
名称空间应该可以做到这一点;只需检查每个名为“lsbsec”的子元素,获取“sbsecloc”和“sbsecanchor”属性,并将uid前置到其值。

尽管代码不是直接的html,但仍然使用标记,因此这个答案在某种程度上适用: