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

ДО:

aaa
aaaa
aaaaaa
a
aa
aaaa
aa
a

Нужно:

а
аа
ааа
аааа
ааааа
аааааа

Каким образом можно отсортировать по количеству букв


Ответы (3 шт):

Автор решения: motpfofs

Мы можем воспользоваться тем, что спец символы ставятся выше при сортировке, чем другие символы.
Можно попробовать решить эту задачу с помощью плагина TextFX. Для начала его нужно установить из менеджера плагинов: Plugins -> Plugins Admin... установка плагина TextFX

Шаг первый Добавляем порядковый номер в начале, чтобы сохранить оригинальный порядок строк, если будут строки одинаковой длинны.
Ставим курсор в самое начало и жмём Edit -> Column Editor... (Комбинация клавиш Alt + C) Указываем Start = 1 Increase by = 1 и обязательно указываем Include Leading Zeros Добавляем нумерацию строк

Шаг второй Делаем отступ в виде спец символов
Нужно добавить спец символы в начало строки. Их количество должно быть равно разнице между самой длинной и самой короткой строкой. Если есть строка 3 символа и строка 59 сиволов, то нужно добавить 56 спец символов. Жмём Edit -> Column Editor... (Комбинация клавиш Alt + C) добавляем отсутпы спецсимволов

Шаг третий Обрезаем строки до одинаковой длинны
Пользуемся регулярным выражением:

^.*(.{26})$

для того, чтобы обрезать строки до одинаковой длинны. Выделяем самую короткую строку и запоминаем её длинну. Переходим в Find/Replace (Комбинация клавиш Ctrl+ H) и в Find what: указываем

^.*(.{26})$

Где вместо 26 - длинна вашей строки. В Replace with... указываем $1. введите сюда описание изображения

Шаг четвёртый Сортируем строки
Выделяем весь текст (Комбинация клавиш Ctrl + A) Идём в TextFx -> TextFx Tools -> Sort lines case sensitive (at column) Если хотите отсортировать от самой длинной к самой короткой отметьте Text FX -> TextFX Tools -> + Sort ascendin сортируем получившиеся строки

Шаг пятый Удаляем ненужные спец символы
Используем ещё одно регулярное выражение:

^_*\d{2}

Переходим в Find/Replace (Комбинация клавиш Ctrl+ H) и в Find what: вставляем следующее

^_*\d{2}

где вместо числа два нужно указать количество цифр в номере строки (в моём примере у меня двухзначная нумерация строк, значит я указываю 2). результат сортировки

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

→ Ссылка
Автор решения: needKVAS

Это можно сделать скриптами

Соответствующие плагины можно установить через Plugins -> Plugins Admin

LuaScript

Установив плагин, в его меню выбираем Edit Startup Script, нам откроется скрипт, который будет запускаться на старте программы. В нём пишем:

local function split(str, sep)
    local result = { }
    local from  = 1
    local startindex, endindex = string.find(str, sep, from)
    while startindex do
        print(string.sub(str, from , startindex-1))
        table.insert( result, string.sub(str, from , startindex-1) )
        from  = endindex + 1
        startindex, endindex = string.find(str, sep, from)
    end
    table.insert(result, string.sub(str, from))
    return result
end

npp.AddShortcut("Sort lines by length", "", function()

    local result
    local SelectionStart, SelectionEnd
    editor:BeginUndoAction()

    local seltext = editor:GetSelText()
    
    local rawtext
    if not (seltext == nil) then
        rawtext = seltext
        SelectionStart = editor.SelectionStart
        SelectionEnd = editor.SelectionEnd
    else
        rawtext = editor:GetText()
    end

    local EOLchar
    if editor.EOLMode == 0 then
      EOLchar = "\r\n"
    elseif editor.EOLMode == 1 then
       EOLchar = "\r"
    elseif editor.EOLMode == 2 then
       EOLchar = "\n"
    end

    local rawtextlines = split(rawtext,EOLchar);

    table.sort(rawtextlines, function(a,b) return utf8.len(a)<utf8.len(b) end)
    
    result = table.concat(rawtextlines, EOLchar)
    
    if not (seltext == nil) then
        editor:ReplaceSel(result)
        editor:SetSel(SelectionStart, SelectionEnd)
    else
        editor:SetText(result)  
    end
    
    editor:EndUndoAction()
    
end)

Далее перезапускаем notepad++, теперь в меню скрипта появился новый пункт меню Sort lines by length. Он отсортирует строки в выделенной области или во всём файле, если выделение пусто. Основан на этом примере.

Python Script

После установки в меню плагина выбираем New Script и создаём файл Sort lines by length.py, в котором пишем:

from Npp import editor

editor.beginUndoAction()
seltext = editor.getSelText()

if seltext:
    rawtext = seltext
    selection_start = editor.getSelectionStart()
    selection_end = editor.getSelectionEnd()
else:
    rawtext = editor.getText()

eol = editor.getEOLMode()
if eol == 0:
    eol_char = "\r\n"
elif eol == 1:
    eol_char = "\r"
elif eol == 2:
    eol_char = "\n"

rawtextlines = rawtext.split(eol_char)

rawtextlines.sort(key=lambda a: len(a.decode('utf-8')))

result = eol_char.join(rawtextlines)

if seltext:
    editor.replaceSel(result)
    editor.setSelection(selection_start, selection_end)
else:
    editor.setText(result)
    
editor.endUndoAction()

Теперь в подменю Plugins -> Python Script -> Scripts появился новый пункт с этим скриптом. Он работает аналогично скрипту на lua.

→ Ссылка