PDA

Просмотр полной версии : Замена слова в строке на случайное из списка.


gait
19.04.2012, 23:22
Здравствуйте!
Есть строка "lorem ipsum dolor sit amet". Мне хотелось бы заменить программно "lorem" на случайное слово из списка ["NGasta!", "Kvata!", "Kvakis"]. То есть, чтобы на входе было "lorem ipsum dolor sit amet", на выходе "NGasta! ipsum dolor sit amet" или "Kvata! ipsum dolor sit amet" или "Kvakis ipsum dolor sit amet". Заранее спасибо!

expl
19.04.2012, 23:30
var text:String = "lorem ipsum dolor sit amet";
var list:Array = ["NGasta!", "Kvata!", "Kvakis"];
text = text.replace(/lorem/g, list[int(Math.random() * list.length)]);

Если уверены, что lorem только один раз упоминается, то можно

text = text.replace("lorem", list[int(Math.random() * list.length)]);

gait
20.04.2012, 00:33
expl, спасибо большое! То что нужно!
Только вот я стал немного менять параметры и захотел изменить слово для замены просто на символ и это не привело ни к чему хорошему. Что нужно сделать, чтобы в тексте "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." заменить все точки на любое слово из списка? (Вместо text = text.replace(/lorem/g, list[int(Math.random() * list.length)]); я использовал text = text.replace(/./g, list[int(Math.random() * list.length)]);, но замена получилась некорректной)

Wolsh
20.04.2012, 00:48
text = text.replace(/\./g, list[int(Math.random() * list.length)]);

gait
20.04.2012, 00:54
Знание регулярок - сила! Пора бы мне уже за них взяться, а то позорюсь тут. Спасибо, Wolsh!

P.S. А! Совсем забыл важную деталь! Дело в том, что при замене хотелось бы, чтобы слово "lorem" менялось на случайное слово из списка, и это случайное слово каждый раз было случайным (необязательно разным, но случайным). То есть текст "lorem lorem lorem lorem lorem" должен превратиться в "Kvata! Kvata! NGasta! Kvakis NGasta!", например. Можно как-то подобное реализовать?

Хотя, наверное, можно вот так:

for (var i:int = 0; i < text.length; i++)
{
text = text.replace(/lorem/, list[int(Math.random() * list.length)]);
}

Wolsh
20.04.2012, 01:38
Обычно "неповторяющийся рэндом" как раз и делают на массивах. Принцип простой – после того как элемент массива был использован, он удаляется из массива (массив тут естественно временная копия исходного массива). Когда массив заканчивается, делаем новую копию. Также надо сделать проверку на совпадение последнего выпавшего элемента и нового, потому как алгоритм выше гарантирует неповторяемость только на протяжении одного "цикла", а на стыках возможны повторы (из новой полной копии массива может выпасть тот же элемент, который был последним единственным в предыдущем проходе).

Добавлено через 10 минут
Другой вариант – когда элемент удаляется из массива, он запоминается в переменной, а когда удаляется следующий элемент, этот сохраненный записывается в массив обратно. И хотя теоретически он может выпасть сразу на следующей итерации, он все-равно будет "отделен" другим элементом (1 0 1). Так же, как и с проверкой на "стыках".

gait
20.04.2012, 02:00
Хм, а я разве где-то писал про "неповторяющийся рэндом"? :)

Wolsh
20.04.2012, 02:02
А как надо пониматьи это случайное слово каждый раз было случайным?

Добавлено через 1 минуту
А, понял, сейчас все точки заменяются на одно и то же слово.

gait
20.04.2012, 02:04
Прощу прощения, если выразил мысль туманно. Там же дальше приписка в скобках. (необязательно разным, но случайным)
В целом всё что нужно, я узнал. Тему, наверное, можно закрывать. Еще раз спасибо expl и Wolsh!