Функция Lua для вывода совпадающих строк в SciTE

Я знаю, как вывести строки совпадающих строк (результат команды find), просто используя editor:MarkerNext():

function print_marked_lines()

    local ml = 0
    local lines = {}

    while true do
        ml = editor:MarkerNext(ml, 2)
        if (ml == -1) then break end
        table.insert(lines, (editor:GetLine(ml)))
        ml = ml + 1
    end

    local text = table.concat(lines)
    print(text)

end

Я не знаю, как выводить только совпадающие строки (а не всю строку, как в опубликованном фрагменте). Я предполагаю, что есть решение, поскольку совпадающие строки выделены и должны иметь какое-то свойство, которое позволяло бы их извлекать, но я полагаю, что необходимы знания Scintilla, поскольку я не смог найти никаких ссылок в предоставленных привязках SciTE.

Пример снимка экрана для поиска / сопоставления всех шаблонов регулярных выражений "I \ w +":

введите описание изображения здесь

Я хочу вывести (распечатать на панель вывода) все выделенные строковые части


person theta    schedule 19.02.2012    source источник


Ответы (1)


@theta, неприятный вопрос (по крайней мере, для меня) :)

Проблема в том, что в диалоговом окне «Найти / заменить» графического интерфейса Scite вы используете один синтаксис регулярного выражения для шаблонов соответствия с обратной косой чертой (скажем, \s); в то время как в функциях Scite lua вы используете другой синтаксис для шаблонов со знаком процента (соответственно %s) - см. мою публикацию в сопоставлении с образцом Lua против регулярных выражений - Stack Overflow. Оттуда у вас есть эти две ссылки:

Соответственно, код для вашей функции («для вывода (печать на панель вывода) всех выделенных частей строки») будет:

function print_marked_lines()

  local sel = editor:GetSelText()

  for mymatch in sel:gmatch"I %w+" do -- note; a regex match!
    print(mymatch)
  end

end

Выводит это в панели вывода из вашего примера текста:

I don
I assume
I guess
I couldn

Надеюсь, это поможет,
Ура!

person sdaau    schedule 22.05.2012
comment
Спасибо за хороший ответ. К сожалению, это потребовало бы знания еще одного синтаксиса шаблонов - Lua. ИМХО editor:findtext(regex) следует использовать, а совпавшие строки дополнительно анализировать на предмет индикаторов сцинтиллы - это то, что я не знал, как это сделать. OTOH, через некоторое время после моего вопроса SciTE представила диалог полосы, который упрощает многие вещи: scintilla.org/SciTELua.html (описано внизу страницы). Например, вот снимок экрана с упаковкой sh и использованием grep для выполнения вышеуказанной задачи: i.imgur.com/XogF9. png - person theta; 22.05.2012
comment
Теперь, когда я читаю связанную страницу, кажется, что генератор editor:match(text, [flags]) - это самый простой способ - person theta; 22.05.2012