Regex: Как проверить, есть ли только пробелы перед выделением - PullRequest
2 голосов
/ 20 сентября 2019

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

  1. Это должно быть последним, что должно появиться в строке

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

Я пытался выровнять следующее:

            //Example                                                                  
            //########.#

            LDT     (exampleCode)
//########.#                E       (exampleCode)
            AND     (exampleCode)                    //########.#
            AND     (exampleCode)            //########.#
            MEMO    (exampleCode)                         //########.#

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

            //Example                                                                  
            //########.#

            LDT     (exampleCode)
//########.#                E       (exampleCode)
            AND     (exampleCode)                    //########.#
            AND     (exampleCode)                    //########.#
            MEMO    (exampleCode)                    //########.#

"// ########. # "это набор символов, которые я хочу выровнять.

Я уже могу следовать первому правилу, используя следующее

//[0-9]{8}\.[0-9a-zA-Z]$

Однако результатв конечном итоге это выглядит так:

            //Example                                                                  
                                                     //########.#

            LDT     (exampleCode)
//########.#                E       (exampleCode)
            AND     (exampleCode)                    //########.#
            AND     (exampleCode)                    //########.#
            MEMO    (exampleCode)                    //########.#

Я хотел бы найти способ проверить, есть ли в строке что-либо, ДО символов, которые я хочу выровнять, так, чтобы она выравнивалась, только если вместо нее есть что-то перед нейтолько пробелы

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

Я предлагаю что-то в два шага:

  • Первый шаг - добавление пробелов в каждую целевую строку, чтобы быть уверенным, что комментарий самой маленькой строки кода находится после столбца, где самый длинныйстрока кода заканчивается.Нет необходимости искать самую длинную строку кода, должно быть достаточно верхнего приблизительного значения.Допустим, 100.

  • На втором этапе удаляются лишние пробелы для выравнивания комментариев.Допустим, вам нужны все комментарии в столбце 80.

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

Проверка, есть лиКод перед комментарием легко решить.Вы должны описать строку с начала и описать непустой символ \S перед комментарием.

  1. первый шаг (укажите количество пробелов, необходимое в строке замены)

поиск: ^\h*\S.*\K(?=//\d{8}\.[[:alnum:]]$)
замена:

второй шаг

поиск: ^(?=\h*\S.*(//\d{8}\.[[:alnum:]]$))(.{80}).*
замена: $2$1

Подробности:

^   # anchor for the start of the line
(?=\h*\S.*(//\d{8}\.[[:alnum:]]$)) # lookahead assertion to
  # select only lines with code before (as in the first pattern)
  # and to capture at the same time the comment substring in the
  # capture group $1
(.{80}) # capture the first 80 chars in group $2
.* # consume the end of the line (useless spaces + comment)

Так как прогноз является толькоутверждение нулевой ширины, оно потребляет символы, таким образом, вы можете сопоставить количество символов, которое вы хотите с начала строки, с .{80}

0 голосов
/ 20 сентября 2019

Глядя на ваш шаблон, я предполагаю, что # - это цифры, которые вы хотите сопоставить [0-9]{8} 8 цифр.

В таком случае, один из вариантов может использовать 2 группы захвата и использоватьте, что в замене.

^(\h*\S+(?:\h+\S+)*)\h+(//[0-9]{8}\.[0-9a-zA-Z])$

По частям

  • ^ Начало строки
  • ( Группа захвата 1
    • \h*\S+ Совпадение 0+ горизонтальных пробельных символов, 1+ непробельных символов
    • (?:\h+\S+)* Повторение 0+ раз, соответствующих 1+ горизонтальных пробельных символов и 1+ непробельных символов
  • ) Закрыть группу
  • \h+ Совпадение 1+ горизонтальных пробельных символов (которые вы хотите заменить)
  • ( Группа захвата 2
    • //[0-9]{8}\.[0-9a-zA-Z]Ваш шаблон (обратите внимание, чтобы избежать точки)
  • ) Закрыть группу
  • $ Конец строки

В заменеиспользуйте 2 группы и заполните желаемое количество пробелов

$1 $2

Regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...