Многострочная замена регулярных выражений с помощью Autohotkey - PullRequest
0 голосов
/ 17 марта 2020

Не могу обернуть голову вокруг правильного регулярного выражения!

МОЯ ЦЕЛЬ

  • добавить 2 пробела в каждую строку выбранного блока текста

МОЙ КОНТЕКСТ

  • некоторым инструментам уценки, которые я использовал, нужно 2 пробела в конце каждой строки для правильного управления списками и т. Д. c.
  • , если файл редактируется несколько раз я не хочу заканчиваться строками, заканчивающимися 4+ пробелами
  • блок текста может быть строкой, абзацем, содержимым всего файла, как показано в редакторе
  • У меня есть какой-то макрос в Notepad ++, который делает свое дело, но я хочу сделать то же самое с Autohotkey, чтобы быть независимым от редактора

МОЙ ПРИМЕР

----

# 2020-03-17

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.

In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,

МОЙ СНИППЕТ ТАК ДАЛЬШЕ

; CTL+SHIFT+F12
^+F12::
    Clipboard = ; Empty the clipboard so that ClipWait has something to detect
    SendInput, ^c ; Copy selected text
    ClipWait
    OutputText := ""
    Loop, parse, Clipboard, `n, `r
    {
        OutputText .= RegExReplace(A_LoopField,"m)^(.*) *$","$1  `r`n")
    }    
    SendRaw % OutputText
return

МОЯ ПРОБЛЕМА

Между символом, игнорируемым при цикле, тем, что я пытаюсь сопоставить, и тем, чем я пытаюсь заменить группу, я получаю гораздо больше строк и пробелов, чем необходимо.

ТЕКУЩИЙ ВЫХОД

----





    # 2020-03-17





        Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.





            Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.





                In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,





Желаемый ВЫХОД

----  

# 2020-03-17  

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.  

Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.  

In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,  

1 Ответ

1 голос
/ 19 марта 2020

Вы получаете слишком много строк в выводе, потому что команда send не работает из-за возвратов каретки, которые там в любом случае не нужны. Я на самом деле не знаю, почему это происходит, и я не могу понять, почему этот подход все равно плох.
А также ваши отступы портятся, потому что ваш текстовый редактор автоматически добавляет на основе отступов на предыдущей строке.

Но в любом случае отправка такого (длинного) ввода никогда не будет хорошей идеей.
Используйте буфер обмена и просто отправьте Ctrl + V, чтобы мгновенно и надежно вставить текст.
Вот пример того, как еще одним способом добавить пробелы в конце:

inp := "
(
----

# 2020-03-17

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.

In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a,
)"

Loop, Parse, inp, `n, `r
    OutputText .= (A_LoopField = "" ? "" : RTrim(A_LoopField) "  ") "`n"
Clipboard := OutputText
SendInput, ^v

Тернар A_LoopField = "" ? "" : RTrim(A_LoopField) " " возвращает true, если строка была пустой, а затем два пробела не добавляются в конец.
Я думаю, что это поведение, которое вы делали.
И RTrim используется для обрезки любых конечных пробелов (или табуляции) с конца, поэтому мы обязательно в итоге получим только два, которые мы хотим.
И, конечно, в конце любой строки мы добавляем один перевод строки `n.

Кроме того, ваш подход к Regex поначалу был также хорош мне это показалось странным, но мы Дай, вот другой способ. И я думаю, это будет более эффективно, хотя вам придется работать с очень большими входами и / или медленным оборудованием, чтобы иметь какое-то существенное значение, ха-ха.

...