JavaScript正则表达式从字符串末尾向开头搜索

3
有没有可能使用正则表达式从字符串的末尾开始搜索?
例如,我有一个字符串:“a2bba2b”
我知道我需要最后一个“/a2/”出现的地方,让机器遍历整个可能很长的字符串似乎效率非常低下。我知道针头将在字符串(干草堆)的末尾附近,因此我想要倒序并简单地告诉脚本从末尾到开头搜索以节省一些资源。
正则表达式似乎是一种匹配更复杂字符串的方法。编写复杂的正则表达式比编写自己的搜索函数容易得多。那么是否有一种方法,或者是标志或其他东西,可以反转搜索顺序以匹配输入字符串的结束而不是开始?现代语言中是否支持这样的功能?如果没有,为什么?

1
你可以将字符串转换为数组,然后使用 Array.prototype.reduceRight().reverse() 来反转字符串,但这样会引入更多的函数调用。当前的方法到底是什么没有返回预期的结果?问题不清楚是什么? - guest271314
问题在于需要搜索的输入字符串非常大,速度至关重要,因此当我使用正则表达式进行搜索时,在大多数情况下,如果能够从末尾到开头搜索,则速度会更快。因为在大多数情况下,我要搜索的内容靠近输入字符串的末尾。您提出的解决方案“reverse”在大型输入字符串上效率非常低,我还不确定“reduceRight”的效果,仍在测试中。如果我可以得到一个布尔值,表示它是否匹配或匹配的字符串的索引,那就太好了。 - Vjerci
1
如果一天内没有人回复,我会去做。大多数时候我都会去做。 - Vjerci
1
你找到了你的针。 - guest271314
1
我也发现了一个效率低下的堆栈,最近似乎我只想在 JS 的 V8 上提交功能请求,因为它没有按照我想要的方式支持我。等我有时间了,我得提交一些拉取请求。 - Vjerci
显示剩余20条评论
2个回答

1
不,JavaScript的RegExp不允许从字符串末尾开始搜索。通常的解决方法是使用贪婪点匹配模式使引擎获取整个字符串,然后回溯以找到最后一个匹配项(如/.*a\d/),但如果大字符串并不真正包含此模式,则会变得很麻烦。
如果目的是提取最后一个匹配项,则可以获取所有匹配项并获取最后一个(s.match(/a\d/g).pop()(当然必须进行空值检查))。
实际上有一些正则表达式引擎可以让您从右到左解析字符串。

0
怎么样将你的字符串和正则表达式反转,然后获取第一个匹配呢?

那似乎需要很多机器时间。 - Vjerci
没有原生的“字符串反转”方法。首先需要将字符串转换为数组,或者实现一个循环。 - guest271314

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