Нахождение последнего (самого правого) совпадения для произвольного регулярного выражения в ruby - PullRequest
6 голосов
/ 02 мая 2009

Я работаю над текстовым редактором в ruby, и мне нужно поддерживать функцию «Найти» с помощью пользовательских шаблонов регулярных выражений. Вот простой (знакомый) вариант использования:

Joe Пользователь редактирует текстовый файл и поместил курсор где-то посередине файла. Он хочет искать в обратном направлении из текущей позиции курсора для поиска ближайшей подстроки, совпадающей с произвольным регулярным выражением.

Я думаю, что эта проблема сводится к применению шаблона пользователя ко всей строке, предшествующей расположению курсора в файле. Конечно, я мог бы перебрать все совпадения с начала файла и использовать последнее совпадение, но это кажется до боли неэффективным ... Было бы лучше искать «справа налево», но я не нашел способа сделать это с ruby ​​Regexp. Вы можете помочь?

Ответы [ 3 ]

11 голосов
/ 02 мая 2009

Используйте метод rindex для вашей строки. Как это:

>> 'ssBssBss'.rindex(/B/)
=> 5
4 голосов
/ 02 мая 2009

при поиске .*(foo) также должен найти самый правый foo, благодаря жадной природе. * (Но rindex может быть быстрее - для проверки нужен микробенч!).

1 голос
/ 02 мая 2009

Я думаю, что rindex - это путь. Кажется, что rindex будет на самом деле перебирать строку в обратном направлении. Проверьте строку 957 из string.c

Похоже, что кто-то нашел способ отменить регулярные выражения в PERL еще в 2001 году. Таким образом, вы бы перевернули строку и перевернули регулярное выражение ... затем использовали метод слева направо.

Я уверен, что это излишне, и вы можете пойти с rindex

...