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

[RegEx] [Exam] Link Strings

Здравейте! И пак съм аз и пак имам проблем с regex-a :) 

това ми е кода (супер семпъл като за начало):

function linkStrings(input) {
    for (var i = 0; i < input.length; i++) {
        var myRegexp = /=([^&]+)/gi;
        var match = myRegexp.exec(input[i]);
        for (var m in match) {
            console.log(match[m]);
        }
    }
}

това ми е входа:

linkStrings(["login=student&password=student"]);
linkStrings(["field=value1&field=value2&field=value3", "http://example.com/over/there?name=ferret"]);
linkStrings(["foo=%20foo&value=+val&foo+=5+%20+203", "foo=poo%20&value=valley&dog=wow+", "url=https://softuni.bg/trainings/coursesinstances/details/1070", "https://softuni.bg/trainings.asp?trainer=nakov&course=oop&course=php"]);

това искам да изкавам от regex: 

а получавам само първите резултати: 

=student
student
5
login=student&password=student
=value1
value1
5
field=value1&field=value2&field=value3
=ferret
ferret
34
http://example.com/over/there?name=ferret
=%20foo
%20foo
3
foo=%20foo&value=+val&foo+=5+%20+203
=poo%20
poo%20
3
foo=poo%20&value=valley&dog=wow+
=https://softuni.bg/trainings/coursesinstances/details/1070
https://softuni.bg/trainings/coursesinstances/details/1070
3
url=https://softuni.bg/trainings/coursesinstances/details/1070
=nakov
nakov
40
https://softuni.bg/trainings.asp?trainer=nakov&course=oop&course=php

 

къде е проблема? и ако може да ми каже някой, а не просто да ми напише работеш regex. Идеята ми е да разбера, къде бъркам.. мерси ;)

Тагове:
0
JavaScript Fundamentals
LoKSET avatar LoKSET 160 Точки
Best Answer

Просто Regexp.exec не се използва така - той връща само първият мач, а не колекции със всички намерени. Трябва да завъртиш един while цикъл от вида на

while (match = myRegexp.exec(input[i])) {

    console.log('.....');

}

за да ги изциклиш всички. Това естествено е един подход - като гледам официалното решение там е направено с много риплейсване и сплитване - също може. Не съм решавал още задачата, но този регекс работи поне за примерите (?:^|\?|&)([^=\?]+)=([^\?&\n]+)(?=$|\?|&) - в regex 101 съм си пуснал и multiline заради това че стринговете реално ще са поотделно. Тогава може и изключването на нов ред да се махне.

 

2
28/01/2016 13:49:57
bulgaria_mitko avatar bulgaria_mitko 132 Точки

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

това ми е кода: http://paste.ofcode.org/MdUTnpVkHamMhNGypWzaut

като въведа входните данни ми дава грешка на ред 24:

                output[key].push(value);
                            ^

TypeError: output[key].push is not a function

 

0
RoYaL avatar RoYaL SoftUni Team Trainer 6846 Точки

Пробвай с оператора "in". if ( ! ( key in output ) )

0
bulgaria_mitko avatar bulgaria_mitko 132 Точки

ако за това ми говориш, защото не знам дали съм те разбрал правилно:

if (!(key in output)) {
  output[key] = [];
}

пробвах ама ми дава пак същата грешка ;(

0
lazarov.pl avatar lazarov.pl 27 Точки

Грешката ти е в това, че итерираш по мача. В конкретния случай резултата от exec-a ти е това: 

["=student", "student", index: 5, input: "login=student&password=student"]

Като завъртиш цикъла ти принтираш всички елементи от масива, а теб те интересува само втория[1].
На нулева позиция винаги имаш целия мач, а на първа мача в групата. В MDN много добре е описано как работи exec(). Погледни таблицата под примера. 

https://jsfiddle.net/vxjd4d25/3/

1
29/01/2016 10:18:52