Софтуерно Инженерство
Loading...
+ Нов въпрос
lapd87 avatar lapd87 69 Точки

[Exam] Programming Fundamentals - November 5th - Problem{3} - Anonymous Vox

Привет,

ако може някой да помогне с едно проблемче което ме гложди :)

В кода ми https://pastebin.com/HdycmNpr се опитах да вкарам код от https://stackoverflow.com/questions/8809354/replace-first-occurrence-of-pattern-in-a-string, но нещо не ми се получи. Закоментирал съм това което искам да направя, а иначе виждате и как съм го избегнал проблема за да си взема точките. Идеята е че при мачване на регекса, мача може да се съдържа и в остатъка от стринга, но просто без start/end и следователно там не трябва да се замества. От форума това което виждам е че би трябвало да има начин с решение на един ред, но така и не успявам да го направя. Моля някой който е наясно с Regex.Replace да обясни как да му сложа ограничение примерно само за първото срещане на текста. Ето това бяха предложили там (единицата накрая), но при мен не успях да го имплементирам:

var regex = new Regex(Regex.Escape("o"));
var newText = regex.Replace("Hello World", "Foo", 1);

Тагове:
0
Technology Fundamentals 06/11/2017 16:39:37
KrasiyMihajlov avatar KrasiyMihajlov 139 Точки
Best Answer

Идеята е че всеки път трябва да си правиш нов регекс от самият стринг, който искаш да реплейснеш.

Така успях да го накрам да работи коректно и сменя само по един резултат.

https://pastebin.com/AJR5PqUr

0
Victuss avatar Victuss 18 Точки

Трябва да му дадеш начален индекс за 100% сигурност, че ще риплейсне, където трябва. Аз съм ползвал Replace метода на Stringbuilder класа. Само трябва да се въведе една променлива, която да отчита корекция при промяна в дължината на текста от разлика в дължините на риплейсван и риплейснат стринг:

https://pastebin.com/TYzfFmR3

 

0
08/11/2017 12:52:32
lapd87 avatar lapd87 69 Точки

Според мен е излишно сложно, но не това е въпроса. Идеята е да разбера как работи горния метод.

0
martinml avatar martinml 285 Точки

regex.Replace(text, "asd") ще върне text, но всички match-ове на regex-a ще бъдат заменени с asd.

regex.Replace(text, match => match.Value + "asd") ще добави след match-овете asd.

Можеш да добавиш трети аргумент, за да кажеш колко match-a да бъдат заменени.

Например regex.Replace(text, "asd", 1) ще замести само първия match.

0
06/11/2017 19:16:59
lapd87 avatar lapd87 69 Точки

" Например regex.Replace(text, "asd") ще замести само първият match "

това нещо го пробвах на изпита и не ми се получи. Гърмяха тестовете където в стринга има текст който е като мача но не е мач реално, защото и там се сменяше.

0
lapd87 avatar lapd87 69 Точки

Благодаря на всички които се включиха вече смятам че разбрах логиката :)

0
peter1998 avatar peter1998 5 Точки

Колега какво матчва това : ([a-zA-Z]+)(.+)(\1) 

пример : ([a-zA-Z]+)(.+)(\1)

0
peter1998 avatar peter1998 5 Точки

Колега супер парче код си намерил знаеш ли беше пропуснал само от инпута да му кажеш от къде да почне да реплейсва ти му беше казал 0 иначе всичко друго точно за reg.Replace беше сложил count 1 в инпут стринга и реплейса да е start ето :

 

input = reg.Replace(input, item.Groups[2].Value, 1, 0);

-първо беше нула

input = reg.Replace(input, item.Groups[2].Value, 1, startIndex );

-след фикса

0
lapd87 avatar lapd87 69 Точки

Виж отговора на колегата който съм маркирал като най-добър. Идеята ми да ползвам това е да пропусна startIndex и Length (редове 31,32,34) за да стане на един ред :) Фикса ти пак ползва допълнителната променлива :) Иначе се радвам че решението ми е помогнало да научиш нещо ново. Аз дори след като взех точките останах над час на изпита да се мъча да го подкарам това...

0