Регекс, который предпочитает более короткие совпадения в матче? (Это более сложный, чем не жадный)

9

Я пытаюсь создать скрипт для выполнения нечеткого поиска внутри буфера. Основная идея состоит в том, чтобы взять некоторый ввод и вставить .\{-}между каждой парой символов, например, fooстановится f.\{-}o.\{-}o.

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

public void put()

Выполнение нечеткого поиска put(так, p.\{-}u.\{-}t) сопоставит всю строку public void put, но более короткое putв этом сопоставлении будет более полезным.

Нежадный оператор хорош для поиска совпадений, которые заканчиваются раньше, но мне нужно что-то, что может в то же время предпочесть совпадения, которые начинаются позже. Концептуально, он не должен быть жадным в обоих направлениях. Это возможно?

tommcdo
источник
См. Также: stackoverflow.com/q/15191291 (нет ответов на ваш вопрос, хотя, к сожалению)
дверная ручка
1
@ Doorknob, нет ответов, но это поднимает хороший вопрос: Regex не начинает поиск с середины строки. Возможно, мне придется задействовать некоторый VimScript, чтобы выполнить работу. Я изучаю идею реверса (длинного) совпадения и ищу в нем обратный паттерн.
tommcdo
2
Тим Поуп выпустил сегодня стог сена . Это похоже на то, что вам нужно. Может быть, вы можете получить от этого вдохновение или даже использовать его.
Токоями
1
Я хочу, чтобы матч начинался как можно позже и заканчивался как можно раньше, при этом удовлетворяя шаблону.
Tommcdo
1
Вы должны взглянуть на так называемые приближенные алгоритмы сопоставления строк , они являются более подходящими инструментами для реализации нечеткого поиска, чем регулярные выражения.
toro2k

Ответы:

2

Примеров недостаточно, но я думаю, что это то, что вы хотите.

.*\zsp.\{-}u.\{-}t

будет соответствовать putв вашем примере вместо public void put. В основном это .*заставляет механизм регулярных выражений начинать поиск строки назад, так как .*сначала потребляет всю строку, а затем возвращается, чтобы найти последнее совпадениеp.\{-}u.\{-}t

FDinoff
источник
Я пробовал это раньше (но забыл до сих пор). Это довольно хорошо, но это означает, что в каждой строке будет только один матч (последний возможный матч). Я все еще хотел бы линию, pouty puppetчтобы дать два матча.
Tommcdo