@fishmen
Новичёк

Как перемешать слова в строках в случайном порядке?

Здравствуйте.
Имеются строки с набором слов(в каждой строке 10 слов),слова в строках написаны через пробелы.
Можно ли с помощью регулярки смешать слова в каждой строке отдельно,поменять их местами в рандомном порядке?

И так же отдельно существует ли регулярка которая мешала бы абсолютно все слова в тексте не выходя за лимит10 слов в строке как в оригинале.
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
@js-newbie
Регулярки не умеют в рандом, но может быть здесь и не нужен настоящий рандом, а сойдёт "псевдо-случайное" перемешивание внутри каждой строки по заданному алгоритму?

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

Пример текста:
Маск отреагировал заявления текущих острых проблемах разработчиками Twitter публикацией лично
Источники подтвердили экстренное собрание разработчиков квартире куда часть сотрудников прилетели
Маск инженерами пытался понять программную основу Twitter принципы работы платформы
Каждый разработчик встрече показывал объяснял Маску свои самые важные фрагменты


Слова в тексте включают символы кириллицы [А-Яа-я] и стандартные символы латиницы плюс цифры [\w] , получаем набор символов [А-Яа-я\w]

Шаблон для каждой строки из 10 слов:
^([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+)$

Разбиваем наш набор символов на пять групп:
[А-Я]
[а-д]
[е-м]
[н-я]
[\w]

Привяжемся к третьему символу второго слова в строке (считая, что в этом слове не менее трёх символов). Пять групп - пять регулярок:
1. Найти
^([А-Яа-я\w]+) ([А-Яа-я\w]{2}[А-Я][А-Яа-я\w]*) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+)$
1. Заменить
$10 $9 $8 $7 $6 $5 $4 $3 $2 $1
2. Найти
^([А-Яа-я\w]+) ([А-Яа-я\w]{2}[а-д][А-Яа-я\w]*) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+)$
2. Заменить
$7 $6 $9 $2 $1 $10 $5 $4 $8 $3
3. Найти
^([А-Яа-я\w]+) ([А-Яа-я\w]{2}[е-м][А-Яа-я\w]*) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+)$
3. Заменить
$9 $10 $7 $8 $4 $3 $2 $1 $6 $5
4. Найти
^([А-Яа-я\w]+) ([А-Яа-я\w]{2}[н-я][А-Яа-я\w]*) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+)$
4. Заменить
$2 $1 $4 $3 $8 $7 $10 $9 $5 $4
5. Найти
^([А-Яа-я\w]+) ([А-Яа-я\w]{2}[\w][А-Яа-я\w]*) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+) ([А-Яа-я\w]+)$
5. Заменить
$3 $5 $10 $1 $9 $8 $6 $7 $4 $2

На выходе получаем что-то вроде:
отреагировал Маск текущих заявления Twitter разработчиками лично публикацией острых текущих
куда квартире сотрудников подтвердили Источники прилетели разработчиков собрание часть экстренное
работы платформы Twitter принципы понять пытался инженерами Маск основу программную
важные фрагменты свои самые показывал встрече разработчик Каждый Маску объяснял


p.s. Расписал подробно для понимания алгоритма, а регулярки можно сократить:
^(\S+) (\S{2}[А-Я]\S*) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+)$
^(\S+) (\S{2}[а-д]\S*) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+)$
^(\S+) (\S{2}[е-м]\S*) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+)$
^(\S+) (\S{2}[н-я]\S*) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+)$
^(\S+) (\S{2}[\w]\S*) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+)$
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@S8S
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы