Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

AnnaProgrammer avatar AnnaProgrammer 74 Точки

Помощ със задача **Secret Data (Strings and RegExp)

Здравейте,

Май въпроса ми е елементарен и съм доста уморена, но просто не мога да разбера тази функция, с която задачата минава със 100/100:

sentence = sentence.replace(regex, function (match) {
    return "|".repeat(match.length);
})

Може ли някакво обяснение? Разбирам какво прави, но не как го прави, т.е. как знае, че параметъра е всъщност самото съвпадение?

И защо това дава само 27 точки:

let match;
do {
    match = regex.exec(sentence);
    if (match){
        sentence = sentence.replace(regex, "|".repeat(match[0].length))
    }
} while(match);

Пълно решение: https://pastebin.com/Rrs4VNyg

Тагове:
1
Module: JS Advanced 01/02/2018 23:32:17
Nikola_Andreev avatar Nikola_Andreev 671 Точки
Best Answer

Привет.
Проблемът е че правиш replace директно със regex а трябва да го правиш със string. Ако си спомняш на лекцията говорихме че когато заместваме с регекс се заменят всички повторения в стринга, а когато го правим с стринг се заменя само първото повторение. В твоя случай ти заменяш абсолютно всички повторения в стринга с брой прави черти генериран от дължината само на първото съвпадение.

За пример ще разгледаме този стринг "+231_23 _2".  Очакваният резултат тук е  "+231||| ||", в твоят случай обаче се добавя още една черта накрая "+231||| |||". Ти правиш това:

sentence = sentence.replace(regex, "|".repeat(match[0].length))

В изречечението имаме 2 съвпадения, _23 и _2. Ти обаче заменяш и 2-те съвпадения с брой черти съответстващи на дължината само на 1 вото и никъде не взимаш в предвид дължината на второто съвпадение. Затова накрая получаваш 2 пъти по ||| , вместо ||| || . Ако заменяш по стринг а не по регекс ще се получи.

sentence = sentence.replace(match[0], "|".repeat(match[0].length))

Така вече заменяш само първото съвпадение с неговата бройка, останалите не се заменят и ще се заменят на следващото завъртане на цикъла. Тогава те ще са match[0] и тяхната дължина ще се вземе в предвид.

2
AnnaProgrammer avatar AnnaProgrammer 74 Точки

Ох да, глупости съм писала laugh Благодаря Ви!

0
emilia98 avatar emilia98 92 Точки

Аз имам абсолютно същия въпрос - по три различни начина я направих, като само единият (с replace(pattern, match => "|".repeat(match.length) )) минава със 100/100. Другите два варианта (с match и exec) не работят коректно във всички случаи.

Решение №1 (Напълно работещото решение)

Решение №2 и Решение №3 (Дават 85/100)

Та, какво е обяснението, за да се получи подобно разминаване? И в двата случая има replace, но явно става по различен начин.

 

0
Nikola_Andreev avatar Nikola_Andreev 671 Точки

При теб не се получава понеже има един тест с 2 еднакви думи, но само едната от тях е валидна. Ето част от теста: (_SecretBase) or (_SecretBase ). Първата дума е невалидна по условие а втората е валидна, но ти заменяш първата. Регекса ти правилно прехваща втората но когато направиш text = text.replace('_SecretBase', "|".repeat('_SecretBase'.length)) , се сменя първият _SecretBase а трябва да смениш вторият.

 

1
emilia98 avatar emilia98 92 Точки

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

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.