为什么这不是非贪婪匹配并只给我图片的名称?
2017-6-23 2:8:54
收藏:0
阅读:88
评论:3
local s = "http://example.com/image.jpg"
print(string.match(s, "/(.-)%.jpg"))
这将给我
--> /example.com/image
但我想得到
--> image
点赞
用户107090
如果你确定在文件名之前的字符串中有一个 /,那么这个代码可以工作:
print(string.match(s, ".*/(.-)%.jpg"))
贪婪匹配 .*/ 将停止在最后一个 /,达到了期望的效果。
2017-06-22 23:20:33
用户1442917
直接回答这个问题:.?-不能保证匹配到最短的结果,因为匹配的左侧部分仍然锚定在当前位置,如果该位置有匹配项,则会返回该匹配项作为结果。非贪婪意味着它会尽可能少地匹配其模式匹配的字符,只要匹配其余部分就可以了。这就是为什么使用[^/]-修复模式,因为它将查找未出现斜杠的最短字符数量,为什么使用.*/.-有效,因为在这种情况下,.*会贪婪地消耗所有东西,然后回溯到匹配其余部分(在这种情况下,将产生相同的结果)。
2017-06-23 05:01:10
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

由于正则表达式引擎是从左到右处理字符串的,所以您的模式找到了第一个
/,然后.-尽可能少地匹配任何字符(.),直到第一个文字的.(与%匹配),然后是jpg子字符串。[](https://i.stack.imgur.com/jpgWO.png)您需要使用否定字符类
[^ /](匹配除/以外的任何字符)而不是匹配任何字符的.:local s = "http://example.com/image.jpg" print(string.match(s, "/([^/]+)%.jpg")) -- => image请参阅在线Lua演示。
[^ /]匹配任何字符_except_/,因此模式"/([^/]+)%.jpg"中的最后一个/将与第一个/匹配。它将匹配为[](https://i.stack.imgur.com/I4hpb.png)从模式中删除第一个
/并不是一个好主意,因为它会使引擎在尝试查找匹配时使用更多的冗余步骤,/将在/符号上“锚定”量化的子模式。引擎更容易找到/而不是寻找除/以外的0+(从一开始就未定义)个字符。如果您确定此字符串出现在字符串的结尾,请在模式的末尾添加
$(实际上不清楚是否需要这样做,但在一般情况下可能是最好的)。