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
比较宽松。
转载于:https://www.cnblogs.com/daochong/p/7363531.html
Lua字符串及模式匹配相关推荐
- Lua字符串库中的几个重点函数介绍
在<Lua中的一些库>中也说到了,要对string库的模式匹配进行单独的讲解.对于字符串的处理,对于任何语言的学习来说,都是一个难点,而且也是一个必会的知识点.给你一个字符串,让你按照某种 ...
- 字符串的模式匹配 (朴素模式匹配算法 ,KMP算法)
字符串的模式匹配 寻找字符串p在字符串t中首次出现的起始位置 字符串的顺序存储 typedef struct {char str[MAXSIZE];int length; }seqstring; 朴素 ...
- lua字符串转数组_深入Lua:字符串管理
Lua的字符串对象表示为下面结构: typedef struct TString {CommonHeader;// 字符串的子类型有两种:长字符串和短字符串// 短字符串:extra表示Lua保留字的 ...
- 字符串的模式匹配(Java实现)
字符串的模式匹配 字串的定位操作通常称做模式匹配,是各种串处理系统中最重要的操作之一.本文主要介绍两种常用的实现算法: 1.暴力匹配 2.KMP算法 1.暴力匹配 时间复杂度为O(n*m):n为主串长 ...
- 算法训练二(字符串、模式匹配、堆栈、队列)(含解题思路)(上)
目录 7-1 好前缀 AC代码: 7-2 好后缀 AC代码: 7-3 [模板]KMP字符串匹配 AC代码: 7-5 接话茬 AC代码: 7-6 串的模式匹配 AC代码: 7-7 词频统计 AC代码: ...
- lua字符串要点归纳
前言 本文主要从<Lua 程序设计>第四版第四章字符串内容中提取关键点,并附带一些自己的使用经验. 简介 lua 语言中,字符使用8个 bit ,也就是一个字节来存储(ascii 是 7- ...
- Step By Step(Lua字符串库)
http://www.cnblogs.com/stephen-liu74/archive/2012/07/11/2425233.html 1. 基础字符串函数: 字符串库中有一些函数非常简单 ...
- string返回第n个字符_Programming in Lualua学习第13期 Lua字符串库
微信公众号:GameToolDev 关注可了解更多的游戏工具开发教程.问题或建议,请公众号留言; 1. 基础字符串函数: 字符串库中有一些函数非常简单,如: 1). string.len( ...
- 字符串的模式匹配,KMP算法
KMP算法是模式匹配的一种改进的算法,所谓的模式匹配也就是对于两个字符串主串S和模式串T.从主串的S的pos个字符起和模式串中的第一个字符进行比较,如果相等,则继续比较后面的字符,否则从主串的下一个字 ...
最新文章
- 一文详解毫米波雷达基本技术与应用
- 如何去掉文章里的非关键词c++_平台运营|阿里国际站代码查找产品三个关键词的方法...
- 2021年慈溪横河中学高考成绩查询,慈溪中学
- c++函数传参:值传递、指针传递、引用传递
- AngularJS 学习笔记值post传值
- PyQt5系列(二)Mac下使用py2app打包python项目
- Atitit 图像处理 平滑 也称 模糊, 归一化块滤波、高斯滤波、中值滤波、双边滤波)
- Raki的读paper小记:SpanBERT: Improving Pre-training by Representing and Predicting Spans
- 信息安全工程师 学习笔记 完结
- 安徽初二计算机考试试题,安徽省八年级信息技术会考题库
- 介绍几种wifi电源管理模式
- 渠道、数据、技术,谁才是网络信贷市场的决胜因素?
- 行列式的两种计算方法
- Jenkins + 云效 前后端项目自动化部署
- SpringBoot项目打包成jar后读取包内文件报错问题解决方法
- 什么是熵(entropy)?
- 网页透明flash代码
- JavaWeb教务管理系统(选课评教,框架SpringMvc+Hibernate)
- 2020年之HBuilderX manifest.json配置最全详解
- 电脑桌面云便签怎么通过便签快捷键设置窗口置顶或置底?