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

时间:2009-05-02 05:32:20

标签: ruby regex reverse

我正在使用ruby中的文本编辑器,我需要使用用户提供的正则表达式模式来支持“查找”功能。这是一个简单的(熟悉的)用例:

  

Joe User正在编辑文本文件,并将光标定位在文件中间的某个位置。他想从当前光标位置搜索向后,找到与任意正则表达式匹配的最近子字符串。

我认为这个问题相当于将用户的模式应用于文件中光标位置之前的整个字符串。当然,我可以从文件的开头循环遍历所有匹配并使用最后一个匹配,但这看起来非常低效......最好搜索“从右到左”,但我还没有找到办法这与ruby Regexp。你能帮忙吗?

3 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:4)

寻找.*(foo)也应该找到最合适的foo,这要归功于。*的贪婪性质(但是rindex可能更快 - 需要微基准测试才能检查!)。

答案 2 :(得分:1)

我认为rindex是要走的路。似乎rindex实际上会向后遍历字符串。查看string.c

的第957行

看起来有人在2001年找到了PERL reverse regular expressions的方法。所以你要反转字符串并反转正则表达式...然后使用从左到右的方法。

我确信现在有点矫枉过正,你可以使用rindex