Lua 字符串查找函数 string.find(s, pattern [, init [, plain]] )【转】

函数原型 string.find(s, pattern [, init [, plain]] ) s: 源字符串 pattern: 待搜索模式串 init: 可选, 起始位置 plain: 我没用过

① 子串匹配:

1print(string.find("haha", 'ah') ) ----- 输出 2 3 2

注意: lua 里面数组或者字符串的字符, 其下标索引是从 1 开始, 不是 0 string.find 默认情况下返回两个值, 即查找到的子串的 起止下标, 如果不存在匹配返回 nil。 如果我们只想要 string.find 返回的第二个值, 可以使用 虚变量(即 下划线)

1_, q=string.find("haha", 'ah') 2print(q) ----- 输出 3

② 模式匹配:

1pair = " name = Anna " 2print(string.find(pair, "(%a+)%s*=%s*(%a+)") ---- 输出 2 12 name Anna

解释: 如果 find 的第二个参数使用了某种匹配模式, 并且模式串里面带括号。 那么表示会“捕捉”括号括起来的模式匹配到的字符串。 捕捉, 当然会把他们作为返回值。这里捕捉了两下, 所以 find 多返回了两个值

那么, 这个模式是怎么匹配的呢? Lua 支持的字符类有:

. 任意字符 %s 空白符 %p 标点 %c 控制字符 %d 数字 %x 十六进制数 %z 代表0的字符 %a 字母 %l 小写字母 %u 大写字母 %w 字母数字 字符类的大写形式代表相应集合的补集, 比如 %A 表示除了字母以外的字符集 另外,* + - 三个,作为通配符分别表示: *: 匹配前面指定的 0 或多个同类字符, 尽可能匹配更长的符合条件的字串 +: 匹配前面指定的 1 或多个同类字符, 尽可能匹配更长的符合条件的字串 -: 匹配前面指定的 0 或多个同类字符, 尽可能匹配更短的符合条件的字串

于是, "(%a+)%s*=%s*(%a+)" 表示, 先匹配一个或多个字母, 然后是零个或多个空白符(比如空格), 然后是个 '=', 然后空白符, 然后字母。这样, 满足匹配的只有 "name = Anna"。 所以输出位置为 2 12. 因为捕获了两个 (%a+), 也就是 name, Anna 这两个单词, 所以还输出了这两个单词

另外, lua 使用 %1-%9 表示拷贝捕获。举例说:

1s="abc \"it's a cat\"" 2_,_,_,q=string.find(s, "([\"'])(.-)%1") 3print(q) -----输出: it's a cat

首先, ["'] 表示匹配 双引号或者单引号, 因为有括号,所以引号被捕获。 然后匹配几个任意字符并且捕获他, 最后 %1 匹配与第一次捕获到的(即引号)相同的字串。所以整个模式匹配到的是 "it's a cat", 而第二次捕获的是去掉两头引号的字串, 即 it's a cat.

还有, '-' 与 '' 到底有什么不同呢? 在上面, "(["'])(.)%1" 匹配到的结果与 '-' 是一样的。尽可能匹配更长, 尽可能匹配更短 究竟什么不同呢?看例子:

1print( ("\"hello\" \"hello\""):find('"(.+)"') ) ----输出 1 15 hello" "hello 2print( ("\"hello\" \"hello\""):find('"(.-)"') ) ----输出 1 7 hello
  • 尽可能长, 所以匹配了首尾两个 引号, 捕获了中间的 (hello" "hello)

  • 尽可能短, 所以碰到第二个引号就说匹配完了, 因此只捕获了第一个 (hello)

原文链接:http://blog.csdn.net/zhangxaochen/article/details/8084396

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang

oracle sql 逗号 分割 REGEXP_SUBSTR 函数

1.REGEXP\_SUBSTR函数.这个函数的作用是正则分隔字符串,用法为functionREGEXP\_SUBSTR(string,pattern,position,occurrence,modifier)参数说明:参数1:string待分割字符串;参数2:pattern正则表达式;参数3:position起

Lua 字符串查找函数 string.find(s, pattern [, init [, plain]] )【转】 - HelloWorld