每场比赛的正则表达式替换匹配

时间:2014-07-14 18:06:52

标签: c# regex

我的代码有点问题应该可行,但由于某种原因没有。 我的想法是我有两个字符串,我需要用另一个文本替换一些文本来修复一些错误。 首先,我的代码:

var rx2 = new Regex(@"<[^><]*>|<[^<]*(<[^>]*>)*[^>]*>");
MatchCollection matchesorig = rx2.Matches(or);
int c = 0;
if (matchesorig.Count > 0)
de = rx2.Replace(de, match =>
{
    var res = matchesorig[c].Value;
    c++;
    return res;
});

所以我从原始字符串(或)中获取了一系列匹配项,然后我转到目标字符串(de)并按匹配替换匹配原始字符串中的匹配

我已经在RegExBuilder进行了测试,并且都有24场比赛,那么为什么我不能得到我想要的结果呢?

根据要求

编辑

or = <bpt id="48"><size val="1400"></bpt><bpt id="49"><fill-sd val="<a:solidFill><a:srgbClr val="616A71"/></a:solidFill>"></bpt>Number of vehicles in COUNTRY <ept id="49"></fill-sd></ept><ept id="48"></size></ept><bpt id="50"><size val="1600"></bpt><bpt id="51"><fill-sd val="<a:solidFill><a:srgbClr val="00A76D"/></a:solidFill>"></bpt>X.XXX.XXX<ept id="51"></fill-sd></ept><ept id="50"></size></ept>
de = <bpt id="48"><size val="1400"></bpt><bpt id="49"><Encher-sd val = "<a:solidFill> <a:srgbClr val="616A71"/> </ a: solidFill>"></bpt>Número de veículos no país <ept id="49"></ Encher-sd></ept><ept id="48"></ Tamanho></ept><bpt id="50"><size val="1600"></bpt><bpt id="51"><Encher-sd val = "<a:solidFill> <a:srgbClr val="00A76D"/> </ a: solidFill>"></bpt>X.XXX.XXX<ept id="51"></ Encher-sd></ept><ept id="50"></ Tamanho></ept>

例外:

The argumente specified was outsider the interval of valid values.
parameter Name: i

在行处抛出异常:

var res = matchesorig[c].Value;

C = 24

EDIT2:正如评论中所指出的,问题de string有一些不一致会打破正则表达式:

< fill-sd val = "< <a:solidFill> a:srgbClr"/"616A71 = val > </a:solidFill>">

注意< <> </。在第一个中,&lt;是不合适的(它应该在下一个&gt;之后,在第二个那里,我正在使用的正则表达式没有考虑到这个空间。这使得de有26个而不是24个匹配。处理空间是微不足道的,但是&lt;在错误的地方怎么样?我无法改变那个字符串,因为我从互联网服务获取它到我无法访问(他们有一个我现在才发现的问题)所以我需要按原样处理字符串。想法?

EDIT3:我想出了这个解决方案(现在测试)

<[^<>]*>|<[^<>]*(<[^<>]*>)*[^<>]*>|<[^<>]*<[^<>]*<[^<>]*>\s{0,1}[^<>]*>\s{0,1}(<[^<>]*>\s{0,1})*[^<>]*>

有人看到任何问题/版本较短吗?

1 个答案:

答案 0 :(得分:0)

经过一些测试后,它归结为以下正则表达式:

<[^<>]*>|<[^<>]*(<[^<>]*>\s{0,1})*[^<>]*>

感谢@Vache指出我正在测试错误的字符串 - duuhh