Regex, який віддає перевагу більш короткі матчі в рамках матчу? (Це більше, ніж не жадібне)


9

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

Це працює досить добре, але приходить багато неідеальних матчів. Я думаю, що нечіткий пошук повинен спочатку дати найкоротші відповідники. Розглянемо наступний приклад:

public void put()

Якщо нечіткий пошук put(так, p.\{-}u.\{-}t) буде відповідати всій рядку public void put, але коротший час putу цій відповідності буде кориснішим.

Не жадібний оператор добре знаходить матчі, які закінчуються раніше, але мені потрібно щось, що може, водночас, віддавати перевагу матчам, які починаються пізніше. Концептуально це має бути не жадібним в обох напрямках. Чи можливо це?


Дивіться також: stackoverflow.com/q/15191291 (хоча, на жаль, немає відповідей на ваше запитання)
Doorknob

1
@Doorknob, відповіді немає, але це спричиняє хорошу точку: Regex не починає пошук із середини рядка. Можливо, мені доведеться задіяти якийсь VimScript, щоб виконати роботу. Я досліджую ідею змінити (довгу) відповідність і шукаю її за зворотною схемою.
tommcdo

2
Тім Поп сьогодні випустив vim-копицю сіна . Це звучить схоже на те, що вам потрібно. Можливо, ви можете отримати від цього щось натхнення або, можливо, навіть використати його.
tokoyami

1
Я хочу, щоб матч розпочався якомога пізніше і закінчився якомога раніше, при цьому все-таки задовольняючи схему.
tommcdo

1
Вам слід поглянути на так звані приблизні алгоритми відповідності рядків , вони є більш підходящими інструментами для реалізації нечіткого пошуку, ніж регулярні вирази.
toro2k

Відповіді:


2

Прикладів недостатньо, але я думаю, що це робить те, що ти хочеш.

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

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


Я раніше це пробував (але досі забув). Це досить добре, але це означає, що завжди буде один матч на рядок (останній можливий матч). Я все одно хотів, щоб лінія хотіла pouty puppetотримати два поєдинки.
tommcdo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.