Функция Lua для вывода согласованных строк в SciTE - PullRequest
1 голос
/ 19 февраля 2012

Я знаю, как вывести строки совпадающих строк (результат команды 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 +":

enter image description here

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

1 Ответ

1 голос
/ 22 мая 2012

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

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

  • Регулярные выражения SciTE - синтаксис шаблона регулярного выражения для использования в диалоговых окнах Scite "Найти / Заменить" в диалогах
    • Обратите внимание, здесь они используют \l в качестве замены для реальных классов персонажей (например, \w и другие)!
  • lua-users wiki:Руководство по шаблонам - синтаксис шаблонов регулярных выражений для использования в сценариях расширения lua в Scite

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

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

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

...