Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Что не так с регуляркой? (https://javascript.ru/forum/offtopic/39665-chto-ne-tak-s-regulyarkojj.html)

l-liava-l 07.07.2013 20:37

Что не так с регуляркой?
 
Доброго времени суток!

Простенькая задачка, нужно менять слова в предложении которые находятся в {} и разделены |

Но я не врубаюсь, что не так с регуляркой? почему {} запоминаются?
<!DOCTYPE html>

<html>
<head>
    <title></title>
    <meta charset="utf8">
</head>

<body>
<script>
    
    
    
    
    function init() {
    var text =  "Я {самый|очень|плохой|доктор|кролик из статей про наследование и}  сантехник, которому не составит труда {написать|сварганить| запостить} код для этого задания, в котором слова будут изменяться {быстро|мгновенно|рэндомно}",

        reg = /(?:\{).*?\|.*?\|?(?:\})/g,
        arrReplace = [], randOut = [],
        search = text.match(reg),
        input = document.getElementById('text');
        
        for (var i = 0; i < search.length; i++) {
        
            arrReplace[i] = search[i];
            arrReplace[i] = arrReplace[i].split('|');
            randOut[i] = arrReplace[i][Math.floor(Math.random()*(arrReplace[i].length))];
            text = text.replace(search[i], randOut[i]);
            
        }
        input.innerHTML = text;
    }
    window.onload = init;



    
    
</script>
<div id="text"></div>

</body>
</html>

iKillMaxmaxmaximus 07.07.2013 20:54

я нихуя не понял

l-liava-l 07.07.2013 20:57

Цитата:

я нихуя не понял
В задачке или в моем скоростном говнокоде?))

Дан текст:

Я {самый|очень|плохой|доктор| кролик из статей про наследование} сантехник, которому не составит труда {написать|сварганить| запостить} код для этого задания, в котором слова будут изменяться {быстро|мгновенно|рэндомно}

нужно взять слова, разделенные | из {}, и рэндомно подставить одно из них вместо {}


Я ищю такие конструкции с помощью регулярки
/(?:\{).*?\|.*?\|?(?:\})/g

и не понимаю почему { и } записываются в массив результатов, я ж юзаю (?:\{)

iKillMaxmaxmaximus 07.07.2013 21:04

лол ща сделаю) после парсинга говносинтаксиса придуманного мной я в регулярках батька)

iKillMaxmaxmaximus 07.07.2013 21:12

var text = 'Я {самый|очень} плохой {доктор|кролик|сантехник} из статей про наследование, которому не составит труда {написать|сварганить| запостить} код для этого задания, в котором слова будут изменяться {быстро|мгновенно|рэндомно}';


  var newText = text.replace(/\{(.+?)\}/img, function(tab, inTag) {
    var words = inTag.split('|');
    var random = Math.round(Math.random() * (words.length - 1));

    return words[random];
  });

  alert(newText);


Ты имел ложное убеждение что все задание нужно решать регуляркой, тебя запутали).
Всю задачу нужно разбивать на куски, которые можно опсиать математикой ну или чем там) так и тут, НЕ НУЖНО стараться сделать все одним куском, НУЖНО стараться разбивать на куски)

1) выдрать из тегов текст
2) разделить его по разделителю
3) выдрать случайное слово из того что разделили
4) вставить это слово за место тега

И нужно уметь видеть эти куски.

НЕ НУЖНО БОЯТЬСЯ ЧТО КОМП БУДЕТ ТУПИТЬ ОТ КОЛИЧЕСТВА ЭТИХ КУСКОВ))) это МИФ

l-liava-l 07.07.2013 21:17

Оу, точняк, благодарю)

iKillMaxmaxmaximus 07.07.2013 21:17

апдейт сделал, прочитай, и в карму плюсуй)

l-liava-l 07.07.2013 21:19

Цитата:

апдейт сделал, прочитай, и в карму плюсуй)
Онииии не дааают плюсоваать))

iKillMaxmaxmaximus 07.07.2013 21:22

но мне нужно больше плюсов( нужно боооольше плюсов..

danik.js 07.07.2013 21:25

Блин, пока ходил котов из-под окна кирпичами гонять вы тут уже порешали все. На всякий случай пощу свой вариант, который кажется что-то напоминает :)
var str = 'Я {самый|очень|плохой|доктор|кролик из статей про наследование и}  сантехник, которому не составит труда {написать|сварганить| запостить} код для этого задания, в котором слова будут изменяться {быстро|мгновенно|рэндомно}';

str = str.replace(/{(.*?)}/gm, function(match, capture) {
    var options = capture.split('|');
    return options[Math.floor(Math.random()*options.length)];
});
alert(str);


Часовой пояс GMT +3, время: 01:13.