Как отсортировать строки по длине слова регулярным выражением Notepad++
ДО:
aaa
aaaa
aaaaaa
a
aa
aaaa
aa
a
Нужно:
а
аа
ааа
аааа
ааааа
аааааа
Каким образом можно отсортировать по количеству букв
Ответы (3 шт):
Мы можем воспользоваться тем, что спец символы ставятся выше при сортировке, чем другие символы.
Можно попробовать решить эту задачу с помощью плагина TextFX. Для начала его нужно установить из менеджера плагинов:
Plugins -> Plugins Admin...

Шаг первый Добавляем порядковый номер в начале, чтобы сохранить оригинальный порядок строк, если будут строки одинаковой длинны.
Ставим курсор в самое начало и жмём 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).

Получаем строки, отсортированные по длинне.
Вместо спецсимвола _ можно использовать любой символ, который не встречается в ваших строках. (Нужно будет немного подправить регулярные выражения.)
Это можно сделать скриптами
Соответствующие плагины можно установить через 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.