如何使用Regex C#替换多个实例

时间:2017-11-06 16:27:34

标签: 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)' 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'>");
        }

以上代码首先替换最后一个实例( sbsecloc | sbsecanchor )。

有更好的替代方法吗?

1 个答案:

答案 0 :(得分:0)

首先,当您处理大量数据时,无论您做什么,都会遇到减速。

然而,你的真正的问题是你试图将方形钉固定在圆孔中。 XML isn't a regular language any more than HTML is; 正则表达式无法处理SGML及其派生词的所有变幻莫测和边缘情况。

应该做的是使用XML解析器。 System.Xml.Linq命名空间应该可以解决问题;只需浏览名为&#34; lsbsec&#34;的每个后代元素,抓住&#34; sbsecloc&#34;和&#34; sbsecanchor&#34;属性,并将uid添加到其值之前。