Ответы пользователя по тегу Регулярные выражения
  • Как перемешать слова в строках в случайном порядке?

    @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 комментарий
  • Как экранировать символы?

    @js-newbie
    const char = "ab"
    const re = new RegExp("["+ char +"]", "g")
    console.log("aabb".match(re).length)
    Ответ написан
    Комментировать
  • Как переместить часть текста в конец строки в Notepad++?

    @js-newbie
    При условии, что в конце строки всегда стоит одна точка.
    Поиск:
    ^(\d+): (.*)[.]{1}$
    Замена:
    \2 \(\1\).
    Ответ написан
    2 комментария