我的代码有点问题应该可行,但由于某种原因没有。 我的想法是我有两个字符串,我需要用另一个文本替换一些文本来修复一些错误。 首先,我的代码:
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})*[^<>]*>
有人看到任何问题/版本较短吗?
答案 0 :(得分:0)
经过一些测试后,它归结为以下正则表达式:
<[^<>]*>|<[^<>]*(<[^<>]*>\s{0,1})*[^<>]*>
感谢@Vache指出我正在测试错误的字符串 - duuhh