Lua学习之字符串函数及模式匹配

对于简单的函数,我只是将其以举例的方式罗列一下,对于一些功能较多的函数,会举例分析一下,并简单总结,全文以举例为驱动。


一,字符类基础函数举例介绍:

string.len( ‘string’ )  

string.lower( ‘string’ )

string.upper( ‘string’ )

string.rep( ‘a’ , 5 )  ==> aaaaa

string.sub( ‘string’ , I , j )

string.sub( s, string.find(s, 'world') )

string.sub函数会提取子串by子串所在字符串的位置下标

string.char()   string.byte()

string.format( ‘%02d:%02d:%02d’ , d , m , y )


 

二,模式匹配(pattern-matching)函数举例介绍:字符串=>被查找的字符串;子串=>要查找的字符():

string.find( 'string', 'substr' )  返回 子串的前后位置

string.find( 'string', 'c' )  返回相同位置

由此,find函数简单查找子串(包含字符返回值是2个值;没有找到,即返回nil

 

string.find( s, 'substr', index ) 该函数的第三个参数是开始查找下标

 

string.match()函数返回匹配到的子串的一份copy

string.match( 'string' , '%d+/%d+%d+') -->12/23/34

 

string.gsub( 'Lua is cute', 'cute', 'great' )  -->Lua is great

用第三个参数替换第一个参数中所有出现的第二个参数,并返回整串以及发生的实际替换次数。


string.gsub( 'all lla' , 'l' , 'x' , 3 ) -->axx xla 第四个参数限制替换的次数

 

string.gmatch(s, '%a') 将返回一个函数,遍历到所有的模式指定子串by返回的函数。

words = {}

for w in string.gmatch( s, "%a+" ) do

words[#words+1] = w

end

 

总结一下:各模式匹配函数的基本简单功能

find( 'string' , 'strsub' , index )   从起始位置(index)查找子串返回位置

match( 'string' , '%s%d.....' )  匹配捕获,返回子串的copy

gmatch( 'string', '%s%d' )  全局匹配捕获,返回一个函数提供所有子串

gsub( 'string' , 'go' , 'come' , count)  替换字符串中所有go子串换count

其实,差不多是根据函数返回值不同,则大约功能相差一些,参数排布相似,并且都是遍历查找功能。那么上面大致的三类就引领了模式匹配3个大的功能方面:查找,捕获,替换。

 

 

三,模式们(基础元素) 模式就是一种字符串,模式函数会解释它们,它们就有了意义

字符分类:(字符,即一个)分类字符们的大写表示相对补集

%d(数字)%a(字母)%c(控制字符)%l(小写字母)

%p(标点)%s(空白字符)%u(大写字母)

%w( a | d )%x(十六进制数字)

特殊字符们: (  )  .  %  +  -  *  ?  [  ]  ^  $

普通字符串,用来转义: ‘\n’

模式函数解释模式串模式中的 特殊字符们需要使用原字符意义用%转义。

但是,尝试了一下这种情况:  string.find( s , ‘^[+-]?%d+$’ ) 依然能够匹配出字符串前面的+-号,当然string.find( s , ‘[%+%-]?%d+’ )也能够匹配出结果。所以,建议使用后者,含义比较清晰。

 

字符集: [%w_]  [AEIOUaeiou]  [0-9A-Fa-f]  [^\n]  [^%s] %S

描述模式的重复和可选:  

+  重复1次以上 

*-  重复随便几次

?  0次,1

 

 

四,捕获 (  )

函数string.match会将所有捕获到的值返回

date = Today is 12/12/2012

d , m , y = string.match( date, (%d+)/(%d+)/(%d+))

%d 用来匹配与前面第d个捕获相同内容,不仅是字符个数相同。

q,quotedPart = string.match( s , ([\”’])(.-)%1)  à%1的地方必须要与前面([\”’])相同的内容来填补%1此位置。

 

s = string.gsub(s , \\(%a+){(.-)} , <%1><%2><\%1> )

%d此展位捕获前面位置内容的项,也可以用在替换函数中。

 

function  trim ( s )

return ( string.gsub( s , ^%s*(.-)%s*$ , %1 ) )

end

 

五,替换

string.gsub 函数的第三个参数不仅是替换的字符串,还可以是一个table , 或者是一个函数。

table: gsub每次找到匹配字符串时,以此字符串作为key,table中对应的value来替换,没有对应value,不替换。

string.gsub( s , $(%w+) , _G )  à _G是全局变量的table

 

function: gsub每次找到匹配字符串时,调用该函数并将匹配字符串作为参数传入。

string.gsub( s , $(%w+) , function(n)

return tostring( _G[n] )

end )


 

一个小的代码演示:

    

local login_string = "abcdeAAAAAA=4543578,SSSSS=qx564201,fcm=0,timestamp=1381311260,idc=U,origin=,c=0,sign=0d0cc04dd64b4c2e2d9d8102834b45d6"


local kvtable = { }   --定义一个用来保存上面字符串的K,V的table.

local login_string_std = string.sub(login_string , 6)   --取得AAA.....开始的后面全部字符串


--login_string字符串中,origin字段木有值,‘*’和‘+’

for k,v in string.gmatch(login_string_std , "(%a+)=(%w*)") do  

kvtable[k] = v    --逐个记录

end

 

六,URL编码 tab扩展 以及一些技巧 

随后,若有时间,再总结。。。

 

************pairs 与 ipairs***************

在遍历table的时候的区别:

首先,说明一下,数组table(array)就是key 为连续数字的table.

那么,简而言之,ipairs 是遍历数组的;pairs是遍历table(k,v)

所以用pairs来遍历table(k,v),将会逐个遍历出来,而遍历table(array)也会全部遍历出来,最后返回nil。。。用ipairs来遍历table(k,v),将会停止在第一个非数字key的地方或者停止在得到的valuenil的地方,而遍历table(array)就顺利全部遍历出来了,返回0

最后,使用ipairs比较严格,使用pairs比较宽松。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
 本套课程分为基础与中级两部分,分别就lua语言的各方面知识点进行探讨,学习完本套课程,对于后续Xlua(Tolua等框架)技术的学习提供强大的语言技术保证。       本套lua课程采用入门与商业级两种开发IDE进行教学:入门级的SciTE内置IDE与商业级的IDEA lua插件。本套课程学习完毕,对于除了传统手游外,在VR、AR、商业级大型应用程序、嵌入式设备开发等领域都有较强的指导作用。           《lua中级篇》分为:“函数的进阶”、“字符串进阶”、“Table进阶”、“元表”、“OOP面向对象”、“协同程序”、“IO操作”、“调试与运行”等八个大的章节,详细深入讲解lua开发的方方面面。        内容包含lua可变参数、闭包、模块、函数尾调用、字符串模式匹配字符串不变性原理、矩阵、链表、元表详解与应用、协同的生命周期与生产消费者问题、lua文件各种读写操作、lua执行外部代码与错误异常处理垃圾收集机制等。       最后,lua中级篇的学习,对于广大学员开发商业级lua热更新技术,具有不可替代的重要作用! 热更新系列(技术含量:中高级):B:《热更新框架设计之Xlua基础视频课程》https://edu.csdn.net/course/detail/27110C:《热更新框架设计之热更流程与热补丁技术》https://edu.csdn.net/course/detail/27118D:《热更新框架设计之客户端热更框架(上)》https://edu.csdn.net/course/detail/27132E:《热更新框架设计之客户端热更框架(中)》https://edu.csdn.net/course/detail/27135F:《热更新框架设计之客户端热更框架(下)》https://edu.csdn.net/course/detail/27136 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值