У меня есть проблема с кодом, который должен работать, но не по какой-то причине. Идея состоит в том, что у меня есть две строки, и мне нужно заменить некоторый текст в тексте на другой, чтобы исправить некоторые ошибки. Во-первых, мой код:Соответствие соответствия регулярному выражению за матч
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})*[^<>]*>
любой любые проблемы/имеет более короткую версию
Каковы ваши строки? Какие результаты вы получаете сейчас? – Vache
Результатом, который я получаю, является выполнение в строке var res = matchesorig [c] .Value; пытаясь сделать замену, когда c = 24, когда должны быть только совпадения от 0 до 23. Я отправлю строки в одно мгновение - придется их регенерировать, и это занимает несколько минут - извините – 537mfb
Было бы здорово, если бы вы могут поделиться некоторыми образцами. – Braj