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

  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字符串及模式匹配相关推荐

  1. Lua字符串库中的几个重点函数介绍

    在<Lua中的一些库>中也说到了,要对string库的模式匹配进行单独的讲解.对于字符串的处理,对于任何语言的学习来说,都是一个难点,而且也是一个必会的知识点.给你一个字符串,让你按照某种 ...

  2. 字符串的模式匹配 (朴素模式匹配算法 ,KMP算法)

    字符串的模式匹配 寻找字符串p在字符串t中首次出现的起始位置 字符串的顺序存储 typedef struct {char str[MAXSIZE];int length; }seqstring; 朴素 ...

  3. lua字符串转数组_深入Lua:字符串管理

    Lua的字符串对象表示为下面结构: typedef struct TString {CommonHeader;// 字符串的子类型有两种:长字符串和短字符串// 短字符串:extra表示Lua保留字的 ...

  4. 字符串的模式匹配(Java实现)

    字符串的模式匹配 字串的定位操作通常称做模式匹配,是各种串处理系统中最重要的操作之一.本文主要介绍两种常用的实现算法: 1.暴力匹配 2.KMP算法 1.暴力匹配 时间复杂度为O(n*m):n为主串长 ...

  5. 算法训练二(字符串、模式匹配、堆栈、队列)(含解题思路)(上)

    目录 7-1 好前缀 AC代码: 7-2 好后缀 AC代码: 7-3 [模板]KMP字符串匹配 AC代码: 7-5 接话茬 AC代码: 7-6 串的模式匹配 AC代码: 7-7 词频统计 AC代码: ...

  6. lua字符串要点归纳

    前言 本文主要从<Lua 程序设计>第四版第四章字符串内容中提取关键点,并附带一些自己的使用经验. 简介 lua 语言中,字符使用8个 bit ,也就是一个字节来存储(ascii 是 7- ...

  7. Step By Step(Lua字符串库)

    http://www.cnblogs.com/stephen-liu74/archive/2012/07/11/2425233.html  1. 基础字符串函数:     字符串库中有一些函数非常简单 ...

  8. string返回第n个字符_Programming in Lualua学习第13期 Lua字符串库

    微信公众号:GameToolDev 关注可了解更多的游戏工具开发教程.问题或建议,请公众号留言; 1. 基础字符串函数:    字符串库中有一些函数非常简单,如:    1). string.len( ...

  9. 字符串的模式匹配,KMP算法

    KMP算法是模式匹配的一种改进的算法,所谓的模式匹配也就是对于两个字符串主串S和模式串T.从主串的S的pos个字符起和模式串中的第一个字符进行比较,如果相等,则继续比较后面的字符,否则从主串的下一个字 ...

最新文章

  1. 一文详解毫米波雷达基本技术与应用
  2. 如何去掉文章里的非关键词c++_平台运营|阿里国际站代码查找产品三个关键词的方法...
  3. 2021年慈溪横河中学高考成绩查询,慈溪中学
  4. c++函数传参:值传递、指针传递、引用传递
  5. AngularJS 学习笔记值post传值
  6. PyQt5系列(二)Mac下使用py2app打包python项目
  7. Atitit   图像处理 平滑 也称 模糊, 归一化块滤波、高斯滤波、中值滤波、双边滤波)
  8. Raki的读paper小记:SpanBERT: Improving Pre-training by Representing and Predicting Spans
  9. 信息安全工程师 学习笔记 完结
  10. 安徽初二计算机考试试题,安徽省八年级信息技术会考题库
  11. 介绍几种wifi电源管理模式
  12. 渠道、数据、技术,谁才是网络信贷市场的决胜因素?
  13. 行列式的两种计算方法
  14. Jenkins + 云效 前后端项目自动化部署
  15. SpringBoot项目打包成jar后读取包内文件报错问题解决方法
  16. 什么是熵(entropy)?
  17. 网页透明flash代码
  18. JavaWeb教务管理系统(选课评教,框架SpringMvc+Hibernate)
  19. 2020年之HBuilderX manifest.json配置最全详解
  20. 电脑桌面云便签怎么通过便签快捷键设置窗口置顶或置底?

热门文章

  1. Python基础----Matplotlib
  2. linux安装操作系统以及配置ip地址
  3. iOS开发基础:OC数组对象NSArray的常用方法
  4. 网站集成QQ登录功能
  5. map-reduce 、map、reduce
  6. matlab做聚类分析
  7. AJAX验证jsp页面验证码
  8. IssueTrackerCSVS 代码笔记-数据层的反射工厂模式
  9. 如何定制日历控件显示的星期文字
  10. C++得到当前进程所占用的内存