原文链接:https://blog.csdn.net/fightsyj/article/details/83615498 在Lua中使用正则表达式进行模式匹配的...(str, pattern[, init]) string.gmatch(str, pattern) 这几个函数的使用方法在前面Lua中string常用api用法整理已经介绍过了,这里就不赘述了!...在Lua中进行模式匹配的时候支持的字符类如下: Lua正则表达式 元字符 描述 备注 %a 匹配字母,无论大小写 %b 匹配对称字符,一般写法为"%bxy",x为开始匹配字符,y为结束匹配字符,xy...可随意指定 例如:"%b"为匹配包括在内的所有字符 %c 匹配控制字符 例如:换行符\n、制表符\t等 %d 匹配数字0-9 %l 匹配小写字母a-z %p 匹配标点符号 %s 匹配空白符号...print(string.match("abc100", "[+-]?%d+")) -- 100 print(string.match("abc-100", "[+-]?
for word in string.gmatch("Hello Lua user", "%a+") do print(word) end Hello Lua user string.match...(str, pattern, init) string.match()只寻找源字串str中的第一个配对....在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil。...= string.match("I have 2 questions for you....", "%d+ %a+") 2 questions = string.format("%d, %q", string.match("I have 2 questions for you.
> string.find("Hello Lua user", "Lua", 1) 7 9 5 string.reverse(arg) 字符串反转 > string.reverse("Lua")...> for word in string.gmatch("Hello Lua user", "%a+") do print(word) end Hello Lua user 12 string.match...(str, pattern, init) string.match()只寻找源字串str中的第一个配对....在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil。...> = string.match("I have 2 questions for you.
LUA脚本的好处是用户可以根据自己注册的一批API(当前TOOL已经提供了几百个函数供大家使用),实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机安装APP差不多,所以在H7-TOOL里面被广泛使用...TOOL的LUA教程争取做到大家可以无痛调用各种功能函数,不需要学习成本。 掌握这些基础就够用了。...把nil,false视为假,其他都为true 4.Lua中的变量全是全局变量,除非用 local 显式声明为局部变量 5....' --由于没有捕获,返回全部匹配 --结果:http://www.armfly.com res = string.match(s,'http://%a+....%a+.com') --如果有捕获,则分别返回捕获结果 --结果:www armfly res1,res2 = string.match(s,'http://(%a+).
实际的用例如下: s = "hello world from Lua" for w in string.gmatch(s, "%a+") do print(w) end 这里是一个捕获并将配对字符分别存到不同变量的例子...如果该配对包含任何捕获信息, 则以编号为1号的捕获作为key值进行查找. 当repl为函数时, 每个成功配对的子字符串均会作为参数被传入到该函数中去....(str, pattern, init) string.match()只寻找源字串str中的第一个配对....在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串....与其他系统的模式不同的是,Lua中的修饰符不能用字符类;不能将模式分组然后使用修饰符作用这个分组。比如,没有一个模式可以匹配一个可选的单词(除非这个单词只有一个字母)。
return 403; } # 对于rest界面的请求进行的拦截 location /rest/request { default_type application/json; lua_need_request_body...on; access_by_lua_block { local data1 = ngx.req.get_body_data() -- 拦截纯DELETE操作 result1...= string.match(data1, "DELETE") if result1 == "DELETE" then ngx.exit(403) end --...拦截_delete_by_query并且是match_all的操作 result2 = string.match(data1, "_delete_by_query") result3 =...string.match(data1, "match_all") result4 = string.match(data1, "POST") if result2 == "_delete_by_query
保留关键字不能作为常量或变量或其他用户自定义标示符: and 、break 、 do 、 else 、 elseif 、end、false 、for 、 function 、if 、in 、 local...Lua 变量 Lua 变量有三种类型:全局变量、局部变量、表中的域。 Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。...string.match(str, pattern, init) string.match()只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。...在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil。...Lua table 使用关联型数组,可以用任意类型的值来作数组的索引,但这个值不能是 nil。 Lua table 是不固定大小的,可以根据自己需要进行扩容。
实现: 这里使用nginx+lua来根据query来拦截。简单起见我们直接安装openresty来实现本次需求。...on; access_by_lua_block { local data1 = ngx.req.get_body_data() -- 拦截纯DELETE操作 result1 = string.match...result1 == "DELETE" then ngx.exit(403) end -- 拦截_delete_by_query并且是match_all的操作 result2 = string.match...(data1, "_delete_by_query") result3 = string.match(data1, "match_all") result4 = string.match(data1...remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } 核心配置就上面的access_by_lua_block
一些词法规范 标识符(或名称)规范:任意字母、数字、下划线组成,不能以数字开头 一般 下划线+大写字母 被用作特殊用途,尽量咱们就不要用 下划线+小写字母 被用作哑变量(Dummy variable...) 还有一些保留字,不能被设置为标识符 and break do else elseif end false goto for function if in local nil not or repeat...任意字符 %a 字母 %c 控制字符 %d 数字 %g 除空格外的可打印字符 %l 小写字母 %p 标点符号 %s 空白字符 %u 大写字母 %w 字母和数字 %x 十六进制数字 魔法字符 + 重复一次或多次...12.3 错误 Lua 语言作为一种嵌入式语言,每次产生错误不能把程序停下来,所以Lua的错误必须处理 我们可以使用 error 函数来传入一个错误信息 ------------------------...代码中处理错误,那么应该使用函数 pcall来封装代码 想要捕获执行中发生的所有错误,那么首先需要将这段代码进行封装到一个函数中,这个函数通常是一个匿名函数,之后通过pcall来调用这个函数 ----
带字符串参数的 String.match 仅返回第一个匹配: let string = 'Hello';let matches = string.match('l');console.log(matches...= string.match(/l/);console.log(matches[0]); // "l"添加 /g 混合let string = "Hello";let ret = string.match...正则表达式捕获组 在 regex 中捕获组只是从 () 括号中提取一个模式,可以使用 /regex/.exec(string) 和string.match 捕捉组。...使用 .matchAll() 的好理由 在与捕获组一起使用时,它可以更加优雅,捕获组只是使用 () 提取模式的正则表达式的一部分。 它返回一个迭代器而不是一个数组,迭代器本身是有用的。...使用 RegEx 对象创建的正则表达式不能使用点 (.) 操作符链接。 - 高级: RegEx 对象更改跟踪最后匹配位置的内部 .lastindex 属性,这在复杂的情况下会造成严重破坏。
try块包含我们需要检查的代码 关键字throw用于抛出自定义错误 catch块处理捕获的错误 finally 块是最终结果无论如何,都会执行的一个块,可以在这个块里面做一些需要善后的事情 1.1 try...JS 代码,例如try块中的以下代码在语法上是错误的,但它不会被catch块捕获。...noSuchVariable; // undefined variable }, 1000); } catch (err) { console.log("这里不会被执行"); } 未捕获的...➤ ⓧ Uncaught Error: Error while executing the code 这里注意两件事: 即使从try块抛出错误后,也会执行finally块 如果没有catch块,错误将不能被优雅地处理...,从而导致未捕获的错误 1.4 try..catch..finally 建议使用try...catch块和可选的finally块。
在很多语言中,正则的转义字符是“\”,但在lua中却不是,至少标准的不是。 引号,使用“\”进行转义,跟字符串定义类似 local s = “\"Hello World!...所有字符 %a 字母 %c 控制字符 %d 数字 %l 小写字母 %p 标点符号 %s 空白字符 %u 大写字符 %w 字母和数字字符 %x 十六进制数字 %z 内部表示为0的字符 + 重复1次或多次...出现0或1次 在lua中还是较为方便的处理嵌套的,因为它有%b - 匹配对称字符。...xddddyxxxxxyxxxy”, “%bxy”, “a”) print(x) =>axxxxaxxa 不过要注意的是string.fromat中的格式跟C语言中的printf一样,与上面表格列出的捕获字符不同
匹配文件名或文件夹名,不能包含一些特殊字符,需要排除字符组 来表示合法字符,且文件名或文件夹名不能为空,至少有一个字符,需要使用量词 +。...、大写字母或小写字母,不能全为数字可以表示如下: const regex = /(?!...Tip3:如果分组后面有量词,则以最后一次捕获的数据为分组。 非捕获括号 之前的例子,括号里的分组或捕获数据,以便后续引用,称之为捕获型分组和捕获型分支。...如果只想使用括号原始功能,可以使用非捕获型括号 (?:p) 和 (?:p1|p2|p3)。...因为捕获分组需要占用内存来存储捕获分组和分支里的数据 独立出确定字符,如 a+ 可以修改为 aa*,后者比前者多确定了字符 a。 提取分支公共部分,如 this|that 修改为 th(:?
扩展库的搜寻路径(';;' 是默认路径) lua_package_path "/data/www/code/nginx+lua/config/lua_p/?....lua;;"; # 设置 C 编写的 Lua 扩展模块的搜寻路径(也可以用 ';;') lua_package_cpath "/data/www/code/nginx+lua/config/lua_p_c.../limiter { lua_code_cache off; content_by_lua_file ..../config/lua/limiter.lua; } } } limiter.lua文件 ngx.header.content_type = "text/html; charset=utf...*", ""); local match = string.match; local ngxmatch = ngx.re.match; --限流计数 local function limit_url_check
但是还是做不到我要的效果,前两天使用lua写了脚本,实现客户访问前端,lua判断文件的创建时间,然后根据设定的时间来自动删除缓存。...nginx 的设置我就不多说了,lua的安装可以参考 《LNMP平滑升级nginx并安装ngx_lua模块教程》 https://www.linuxidc.com/Linux/2018-04/152034....htm lua代码就很简单了。...用户访问前端完毕的时候,自动执行lua脚本,lua首先根据url来获取缓存文件路径,判断文件是否存在。如果存在获取文件的修改时间, 同时判断修改时间和缓存过期时间是否一致,一致的话删除缓存文件。...lfs = require"lfs" local new_att = assert (lfs.attributes(getfile)) local oldTime=new_att.change if(string.match
String.match, match只返回字符串参数第一个符合匹配的。...'l' 添加 /g String.match使用正则表达式带上 /g标签会返回多个匹配。...正则表达式捕获组 在正则表达式中捕获组只是在 ()括号中提取匹配。你可以从 /regex/.exec(string)和 string.match捕获组。 通常捕获组是在匹配规则中被创建的。...现在我们有足够的背景知识回答这个问题: 最好使用 .matchAll() 使用捕获组时更加优雅。捕获组知识带有提取模式()的正则表达式的一部分。 它返回一个迭代器而不是数组,迭代器本身很有用。...使用 RegExp对象创建的正则表达式不能使用点( .)运算符链接。 **高级: RegEx**对象跟踪最后匹配位置的内部 .lastIndex属性,这可能对复杂案例有破坏性的事情。
Lua字符串的表示方式单引号和双引号:Lua中的字符串可以用单引号或双引号括起来。它们之间没有区别,可以根据个人喜好选择使用。...连接运算符:Lua中的字符串连接使用两个点.。lualocal str = "Hello, " str = str .. "World!"...No need for escape characters. ]] print(multilineString)字符串操作Lua提供了一些基本的字符串操作函数,它们都包含在string库中。...string.match(s, pattern):搜索字符串s中第一次出现的模式pattern,并返回匹配的部分。...接着,我们查找文本中第一次出现的单词"Lua",并显示其位置。最后,我们将文本中所有出现的"Lua"替换为"Programming Language",并显示替换后的文本。
服务端选择Lua作为编程语言,同时利用了Redis的PIPELINING机制批量查询数据: local redis = require "resty.redis" local cjson = require...val in ipairs(args["packages"]) do if type(val) == "string" then local name, version = string.match...实际操作时,我们可以把应用的版本缓存到Nginx/Lua共享内存里,客户端请求先在Nginx/Lua共享内存过滤一次,然后再判断是否需要查询Redis。...为了使用共享内存,需要在Nginx配置文件中声明: lua_shared_dict versions 100m; 改良后的代码如下所示,注意其中共享内存的查询和设置部分的代码: local redis...val in ipairs(args["packages"]) do if type(val) == "string" then local name, version = string.match
带字符串参数的 String.match 仅返回第一个匹配: let string = 'Hello'; let matches = string.match('l'); console.log(matches...在解疑这个问题之前,先来看看 捕获组。...正则表达式捕获组 在 regex 中捕获组只是从 () 括号中提取一个模式,可以使用 /regex/.exec(string) 和string.match 捕捉组。...使用 .matchAll() 的好理由 在与捕获组一起使用时,它可以更加优雅,捕获组只是使用 () 提取模式的正则表达式的一部分。 它返回一个迭代器而不是一个数组,迭代器本身是有用的。...使用 RegEx 对象创建的正则表达式不能使用点 (.) 操作符链接。 高级: RegEx 对象更改跟踪最后匹配位置的内部 .lastindex 属性,这在复杂的情况下会造成严重破坏。