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

    @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
    Режим поиска: Регулярные выражения
    Поиск: locs/(.*)\.dat"
    Замена: ".locs\("\1"\)."
    Ответ написан
    4 комментария
  • Как добавить в конец строки повтор конца строки?

    @js-newbie
    Поиск:
    >>>(.*)$
    Замена:
    >>>\1\\\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 комментария
  • Почему макрос вставки изображений в Word работает странно?

    @js-newbie Автор вопроса
    Разобрался сам. Строка Selection.Find.Execute в цикле Do While (.Execute = True) ... Loop была лишней. Она и заставляла при нахождении ссылки сразу искать следующую и только потом выполнять действия.

    В итоге макрос должен быть таким:
    Sub Link2img()
        Dim TempData As DataObject, Count As Integer, ImgURL, ImgNum As String
        Count = 0
        Selection.HomeKey Unit:=wdStory
        With Selection.Find
            .ClearFormatting
            .Text = "https://aaa.bbb.com/images/?*.[jpng]{3}"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchAllWordForms = False
            .MatchSoundsLike = False
            .MatchWildcards = True
            Do While (.Execute = True)
                Selection.Copy
                Set TempData = New DataObject
                TempData.GetFromClipboard
                ImgURL = TempData.GetText
                Selection.Delete
                Selection.InlineShapes.AddPicture FileName:=ImgURL, LinkToFile:=False, SaveWithDocument:=True
                Count = Count + 1
            Loop
        End With
        If Count < 2 Then ImgNum = " изображение"
        If Count > 1 And Count < 5 Then ImgNum = " изображения"
        If Count > 4 Then ImgNum = " изображений"
        MsgBox ("Вставлено " & Count & ImgNum)
    End Sub
    Ответ написан