Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Удаление 2 случайных команд, только если они НЕ в строковых литерах (https://javascript.ru/forum/misc/70670-udalenie-2-sluchajjnykh-komand-tolko-esli-oni-ne-v-strokovykh-literakh.html)

Shellait 24.09.2017 11:05

Удаление 2 случайных команд, только если они НЕ в строковых литерах
 
Текст является программной на Javascript, удалить две команды JS, но только если они не в строковых литерах (break как команду удалить можно, а в строке "break my heart" нельзя).

Пример переменной: var jsScript = 'var text = "hello world"; alert(text);';

Чувствую путь спасения через RegExp. Вычитал в учебнике поиск слов только в строковых литерах, но как удалить именно не в них, ещё и случайно и потом вывести переменную jsScript с сохранившейся структурой ума не приложу.

void() 24.09.2017 15:17

Что-то я не до конца понял, чего вы хотите. Но команды отделяются символом ";". Так что можно попробовать разбить строку с командами на массив

var jsScript = 'var text = "hello world"; alert(text);';
var x = jsScript.split(';');


И теперь уже легче намного манипулировать ими. Перебирать циклами.
К примеру в данном случае:

x[0] // выведет var text = "hello world"
x[1] // выведет alert(text)


Ну а дальше можно их проверять, удалять. Можно добавлять, перемещать и все, что хотите. Без RegExp.

Shellait 25.09.2017 06:39

Мне требуется удалить случайное слово. Но оно не должно входить в "" или ''. Например из примера
Код:

var jsScript = 'var text = "hello world"; alert(text);';
Нельзя удалить hellow world. Так как они входят в "", а например text уже можно, поскольку это получается отдельное слово.

рони 25.09.2017 08:57

Shellait,
<script>
var jsScript = 'var text = "hello world"; alert(text);';

function fn(str, num) {
    var reg = /\w+|".*?"|'.*?'/g,
        arr = str.match(reg);
    if (arr) {
        arr = arr.reduce(function(a, b, i) {
            if (!/"/.test(b)) a.push(i);
            return a
        }, []);
        for (; arr.length > num;) arr.splice(Math.random() * arr.length | 0, 1);
        num = 0;
        str = str.replace(reg, function(a) {
            return arr.indexOf(num++) > -1 ? "" : a
        })
    }
    return str
};
for (var i=0; i<5; i++)  {document.write(fn(jsScript, 2)+"<br>")}

</script>

ksa 25.09.2017 08:59

Цитата:

Сообщение от void() (Сообщение 465301)
Но команды отделяются символом ";". Так что можно попробовать разбить строку с командами на массив
var jsScript = 'var text = "hello world"; alert(text);';
var x = jsScript.split(';');

Если разбивать, то разбивать лучше так
var jsScript = 'var text = "hello world"; alert(text);';
var x = jsScript.split(/"[\s\S]+?"/);
alert(x);

Alexandroppolus 25.09.2017 10:25

Идеи по решению:

https://jsfiddle.net/rqgsn72p/

сначала создает массив границ слов. Потом берет случайный элемент массива. Выкидывает это слово из строки.

в примере должно выкидывать только word0, word5 или word6. Прочие ворды сидят в строках или регексах

Alexandroppolus 25.09.2017 13:41

если в строке могут быть ещё и комментарии, придется допиливать.

Shellait 25.09.2017 19:57

Всем спасибо. Вы очень выручили, пойду грызть учебник по JS дальше.


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