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' ) 返回相同位置
string.find( s, 'substr', index ) 该函数的第三个参数是开始查找下标
由此,find函数简单查找子串(包含字符) 返回值是2个值;没有找到,即返回nil。
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
函数: gsub
每次找到匹配字符串时,调用该函数并将匹配字符串作为参数传入。
string.gsub( s , “$(%w+)” , function(n)
return tostring( _G[n] )
end )
举例
将login_string长字符串中内容读取到一个table中,去除前面无意义前缀
login_string = "lgn|Puserid=4542379,svrid=qxzh0001,fcm=0,timestamp=1381311260,idc=U,origin=,c=0,sign=0d0cc04dd64b4c2e2d9d8102834b45d6"
--长字符串中前5个字符去掉
kvtable = { }
login_string_std = string.sub(login_string , 6) -- lua中索引从1开始
--因为长字符串中有字段的内容为空'origin',模式中第二个选用*
for k,v in string.gmatch(login_string_std , "(%a+)=(%w*)") do
kvtable[k] = v
end
补充:pairs 与 ipairs
在遍历table
的时候的区别:
首先,说明一下,数组table(array)
就是 key 为连续数字的table.
那么,简而言之,ipairs
是遍历数组的;pairs
是遍历记录table(k,v)的
用
pairs
来遍历table(k,v),将会逐个读取出来,而遍历table(array)也会全部读取出来。
用ipairs
来遍历table(k,v),将会停止在第一个非数字key的地方或者停止在得到的value是nil的地方,而遍历table(array)就顺利全部遍历出来了,返回0。
最后,使用ipairs
比较严格,使用pairs
比较宽松。
Lua字符串及模式匹配的更多相关文章
- lua中的字符串操作(模式匹配)
(一). 模式匹配函数在string库中功能最强大的函数是:string.find(字符串查找)string.gsub(全局字符串替换)string.gfind(全局字符串查找)string.gmat ...
- Lua字符串库(整理)
Lua字符串库小集 1. 基础字符串函数: 字符串库中有一些函数非常简单,如: 1). string.len(s) 返回字符串s的长度: 2). string.rep(s,n) 返回 ...
- Lua 学习之基础篇三<Lua 字符串操作>
Lua字符串可以使用以下三种方式表示: 单引号间的一串字符. 双引号间的一串字符. [[和]]间的一串字符. string = [["Lua"]] print("字符串 ...
- Step By Step(Lua字符串库)
Step By Step(Lua字符串库) 1. 基础字符串函数: 字符串库中有一些函数非常简单,如: 1). string.len(s) 返回字符串s的长度: 2). string ...
- 字符串的模式匹配(Java实现)
字符串的模式匹配 字串的定位操作通常称做模式匹配,是各种串处理系统中最重要的操作之一.本文主要介绍两种常用的实现算法: 1.暴力匹配 2.KMP算法 1.暴力匹配 时间复杂度为O(n*m):n为主串长 ...
- lua 字符串
lua 字符串 语法 单引号 双引号 "[[字符串]]" 示例程序 local name1 = 'liao1' local name2 = "liao2" lo ...
- cocos2d-x -Lua 字符串
字符串或串(String)是由数字.字母.下划线组成的一串字符. Lua 语言中字符串可以使用以下三种方式来表示: 单引号间的一串字符. 双引号间的一串字符. [[和]]间的一串字符. 以上三种方式的 ...
- lua字符串
本文内容基于版本:Lua 5.3.0 概述 Lua字符串中的合法字符可以是任何的1字节数据,这包括了C语言中表示字符串结束的'\0'字符,也就是说Lua字符串在内部将以带长度的内存块的形式存储,存储的 ...
- Lua学习九----------Lua字符串
© 版权声明:本文为博主原创文章,转载请注明出处 1.Lua字符串 - ''单引号间的一串字符 - ""双引号之间的一串字符 - [[]]之间的一串字符 2.Lua转义字符 3.字 ...
随机推荐
- kubernetes 存储volume,pv和pvc的使用
emptyDIR 临时目录 hostPath :使用主机的路径 网络存储: 传统的设备存储:NAS,SAN 分布式存储:glusterfs,rbd,cephfs 云存储:EBS,Azure,阿里云的 ...
- Crash的数字表格 / JZPTAB
https://www.cnblogs.com/peng-ym/p/8666124.html #include<bits/stdc++.h> #define LL long long #d ...
- ARP输入 之 arp_rcv
概述 arp_rcv是ARP包的入口函数,ARP模块在二层注册了类型为ETH_P_ARP的数据包回调函数arp_rcv,当收到ARP包时,二层进行分发,调用arp_rcv: arp_rcv对ARP输入 ...
- Arcgis python输出当前窗口
import arcpy mxd = arcpy.mapping.MapDocument("CURRENT") mxdfile=arcpy.GetParameterAsText(0 ...
- PHP中的src32
crc32() 函数计算一个字符串的 crc32 多项式. 该函数可用于验证数据的完整性. 语法 crc32(str 参数 描述 string 必需.规定要计算的字符串. 说明 生成 string 参 ...
- centos 如何查看命令是由哪个包提供的
yum whatprovides */ifconfig Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile ...
- POJ 1789 -- Truck History(Prim)
POJ 1789 -- Truck History Prim求分母的最小.即求最小生成树 #include<iostream> #include<cstring> #incl ...
- 多目标优化算法(一)NSGA-Ⅱ(NSGA2)(转载)
多目标优化算法(一)NSGA-Ⅱ(NSGA2) 本文链接:https://blog.csdn.net/qq_40434430/article/details/82876572多目标优化算法(一)NSG ...
- PCB Layout初学者必会知识总结(转)
PCB是印刷电路板(即Printed Circuit Board)的简称.印刷电路板是组装电子零件用的基板,是在通用基材上按预定设计形成点间连接及印制元件的印制板.该产品的主要功能是使各种电子零组件形 ...
- docker安装和基本命令
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口. ...