Как использовать регулярные выражения для отступа кода в блокноте ++

например у меня есть следующий код

Module MPI
    Use MPI
    !
! MPI info
    If (true) Then
        Print *, ''
! empty line 1
! empty line 2
    End If
    Integer ithread, nthread, ierr
End Module MPI

Строки начинаются с! знак, который является строкой комментариев в Фортран.Я хочу, чтобы эти строки комментариев имели тот же отступ, что и их предыдущий отступ.

То есть я хочу этот формат

Module MPI
    Use MPI
    !
    ! MPI info
    If (true) Then
        Print *, ''
        ! empty line 1
        ! empty line 2
    End If
    Integer ithread, nthread, ierr
End Module MPI

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

Вот что я пробовал: заменить^(\s*)(.*?\r\n)\s*\! какСтроки начинаются с2$1!, Однако это производит

Module MPI
    Use MPI
    !
! MPI info
    If (true) Then
        Print *, ''
        ! empty line 1
! empty line 2
    End If
    Integer ithread, nthread, ierr
End Module MPI

Есть еще две строки не правильно. Кажется, что хотя картина^(\s*)(.*?\r\n)\s*\! соответствует этой строке, однако, он просто пропускает ее, поскольку движок регулярных выражений уже соответствует предыдущим строкам.

Мой вопрос, как решить эту проблему с помощью регулярных выражений?

 Tim Biegeleisen19 июл. 2016 г., 09:44
Это похоже на работу для парсера.
 user1596419 июл. 2016 г., 10:00
@TimBiegeleisen Мой вопрос на самом деле является постобработкой результата, генерируемого universalindentGUI
 horcrux19 июл. 2016 г., 10:29
Разрешено ли использовать одно и то же регулярное выражение несколько раз? Например, у вас есть не более 3 последовательных строк комментариев, поэтому вы нажмете кнопку «Заменить все» 3 раза.

Ответы на вопрос(2)

Решение Вопроса

^( +)(.*\R)(!) и заменить текст\1\2\1\3 затем дважды нажмите «Заменить все», чтобы выполнить то, что нужно для образца текста. Я не вижу способа сделать это за один проход.

Выражение ищет строку с начальными пробелами, за которой следует строка, начинающаяся с!, Группы захвата являются ведущими пробелами в\1, остальная часть этой строки, включая перевод строки\2 и ведущий! в\3, Замена просто собирает захваты в правильном порядке. Обратите внимание, что вы можете опустить группу захвата вокруг! и просто иметь явное `! в замене, но мне нравится использовать захваты в таких контекстах, поскольку они часто допускают более короткие замены (хотя не в этом случае) и более легкие улучшения.

чтобы сделать отступ, я думаю, что невозможно использовать тот же самый весьотредактированный строка для следующего матча, чтобы получить количество пробелов. Поэтому я думаю, что вы должны повторить одну и ту же замену несколько раз. Попробуйте с:

^(\s*)([^!\s].*?\r\n(\1\!.*?\r\n)*)\s*\!

всегда заменяя егоСтроки начинаются с2$1!.

Как я уже говорил в комментарии, если у вас есть не более N последовательных строк комментариев, вы нажмете кнопку «заменить все» N раз

Ваш ответ на вопрос