在Ruby中查找任意正则表达式的最后(最右边)匹配

7
我正在使用Ruby开发文本编辑器,需要支持用户提供的正则表达式模式的“查找”功能。以下是一个简单(熟悉的)用例:
Joe User正在编辑一个文本文件,并已将光标定位在文件的中间某个位置。他想要向后搜索,以查找与任意正则表达式匹配的最近子字符串。
我认为这个问题相当于将用户的模式应用于光标位置之前的整个字符串。当然,我可以从文件开头循环遍历所有匹配项并使用最后一个匹配项,但这似乎非常低效...更好的方法是进行“从右到左”的搜索,但我没有找到使用Ruby Regexp实现这一点的方法。你能帮忙吗?
3个回答

11

使用字符串的rindex方法。像这样:

>> 'ssBssBss'.rindex(/B/)
=> 5

5

寻找.*(foo)也应该定位到最右边的foo,这要归功于 .* 的贪婪性质(但是rindex可能更快——需要进行微基准测试来检查!)。


这是一个有用的通用正则表达式解决方案,适用于那些因使用其他语言而没有rindex的人。(对我来说,它看起来比被接受的答案更清晰。) - Jon Ericson

1

我认为rindex是正确的选择。它似乎会反向迭代字符串。请看string.c的957行。

看起来有人在2001年就已经想出了一种在PERL中反转正则表达式的方法。因此,您将翻转字符串和正则表达式...然后使用从左到右的方法。

我相信现在可以采用rindex的方法了,使用翻转字符串的方法可能过于复杂了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接