2014-07-14 6 views
0

У меня есть проблема с кодом, который должен работать, но не по какой-то причине. Идея состоит в том, что у меня есть две строки, и мне нужно заменить некоторый текст в тексте на другой, чтобы исправить некоторые ошибки. Во-первых, мой код:Соответствие соответствия регулярному выражению за матч

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; 
}); 

Так я получить коллекцию спичек из моей исходной строки (или), а затем я иду в целевой строке (де) и идти матч на матч, заменяющего с матчем в origibal string

Я протестировал в RegExBuilder, и у обоих есть 24 совпадения, так почему бы мне не получить результат, который я хочу?

EDIT: в соответствии с просьбой:

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; 

С С = 24

EDIT2: Как отметил ИНТ комментарии, проблема де строка имеет несколько inconsistences, которые нарушают регулярное выражение:

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

Уведомление о < < и > </. В первом случае < неуместен (он должен быть после следующего>, а во втором - пробел, который не учитывается в регулярном выражении, которое я использую. Это означает, что у него есть 26, а не 24 совпадения. является тривиальным, но как насчет < в неправильном месте? Я не могу изменить эту строку, поскольку я получаю ее от интернет-службы, к которой у меня нет доступа (у них есть проблема, которую я только нашел сейчас), поэтому мне нужно иметь дело со строкой как есть идеи

EDIT3:.? Я пришел к этому решению (сейчас тестируется)

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

любой любые проблемы/имеет более короткую версию

+1

Каковы ваши строки? Какие результаты вы получаете сейчас? – Vache

+0

Результатом, который я получаю, является выполнение в строке var res = matchesorig [c] .Value; пытаясь сделать замену, когда c = 24, когда должны быть только совпадения от 0 до 23. Я отправлю строки в одно мгновение - придется их регенерировать, и это занимает несколько минут - извините – 537mfb

+0

Было бы здорово, если бы вы могут поделиться некоторыми образцами. – Braj

ответ

0

После некоторых испытаний, сводились к следующему регулярному выражению:

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

благодарности @Vache за указание я проверял неправильную строку - duuhh

Смежные вопросы