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

  1. string.len( string )
  2. string.lower( string )
  3. string.upper( string )
  4. string.rep( a , 5 ) ==> aaaaa
  5. string.sub( string , I , j )
  6. string.sub( s, string.find(s, 'world') )
  7. string.sub函数会提取子串by子串所在字符串的位置下标
  8. string.char() string.byte()
  9. string.format( ‘%02d:%02d:%02d , d , m , y )

模式匹配(pattern-matching)函数举例介绍:

字符串=>被查找的字符串
子串=>要查找的字符(串)

  1. string.find( 'string', 'substr' ) 返回 子串的前后位置
  2. string.find( 'string', 'c' ) 返回相同位置
  3. string.find( s, 'substr', index ) 该函数的第三个参数是开始查找下标

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

  1. string.match()函数返回匹配到的子串的一份copy
  2. string.match( 'string' , '%d+/%d+%d+') -->12/23/34
  3. string.gsub( 'Lua is cute', 'cute', 'great' ) -->Lua is great

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

  1. string.gsub( 'all lla' , 'l' , 'x' , 3 ) -->axx xla 第四个参数限制替换的次数
  2. string.gmatch(s, '%a') 将返回一个函数,遍历到所有的模式指定子串by返回的函数。
  3. words = {}
  4. for w in string.gmatch( s, "%a+" ) do
  5. words[#words+1] = w
  6. end

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

  1. `find( 'string' , 'strsub' , index )` 从起始位置(index)查找子串返回位置
  2. `match( 'string' , '%s%d.....' )` 匹配捕获,返回子串的copy
  3. `gmatch( 'string', '%s%d' )` 全局匹配捕获,返回一个函数提供所有子串
  4. `gsub( 'string' , 'go' , 'come' , count)` 替换字符串中所有go子串换count

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


模式们(基础元素)

模式就是一种字符串,模式函数会解释它们,它们就有了意义
字符分类:(字符,即一个)分类字符们的大写表示相对补集

  1. %d(数字) %a(字母) %c(控制字符) %l(小写字母)
  2. %p(标点) %s(空白字符) %u(大写字母)
  3. %w( a | d ) %x(十六进制数字)
  4. 特殊字符们: ( ) . % + - * ? [ ] ^ $
  5. 普通字符串,用来转义: ‘\n

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

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

  1. 字符集: [%w_] [AEIOUaeiou] [0-9A-Fa-f] [^\n] [^%s] %S
  2. 描述模式的重复和可选:
  3. + 重复1次以上
  4. *- 重复随便几次
  5. ? 0次,1

捕获 “( )”

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

  1. date = Today is 12/12/2012
  2. d , m , y = string.match( date, “(%d+)/(%d+)/(%d+)”)
  3. %d 用来匹配与前面第d个捕获相同内容,不仅是字符个数相同。
  4. q,quotedPart = string.match( s , “([\”’])(.-)%1”) %1的地方必须要与前面([\”’])相同的内容来填补%1此位置。
  5. s = string.gsub(s , \\(%a+){(.-)}” , “<%1><%2><\%1>” )

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

  1. function trim ( s )
  2. return ( string.gsub( s , “^%s*(.-)%s*$ , “%1 ) )
  3. end

替换

string.gsub 函数的第三个参数不仅是替换的字符串,还可以是一个table , 或者是一个函数。
table: gsub 每次找到匹配字符串时,以此字符串作为key,用table中对应的value来替换,没有对应value,不替换。
string.gsub( s , “$(%w+)” , _G ) _G是全局变量的table

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

  1. string.gsub( s , $(%w+)” , function(n)
  2. return tostring( _G[n] )
  3. end )

举例

将login_string长字符串中内容读取到一个table中,去除前面无意义前缀

  1. login_string = "lgn|Puserid=4542379,svrid=qxzh0001,fcm=0,timestamp=1381311260,idc=U,origin=,c=0,sign=0d0cc04dd64b4c2e2d9d8102834b45d6"
  2. --长字符串中前5个字符去掉
  3. kvtable = { }
  4. login_string_std = string.sub(login_string , 6) -- lua中索引从1开始
  5. --因为长字符串中有字段的内容为空'origin',模式中第二个选用*
  6. for k,v in string.gmatch(login_string_std , "(%a+)=(%w*)") do
  7. kvtable[k] = v
  8. 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字符串及模式匹配的更多相关文章

  1. lua中的字符串操作(模式匹配)

    (一). 模式匹配函数在string库中功能最强大的函数是:string.find(字符串查找)string.gsub(全局字符串替换)string.gfind(全局字符串查找)string.gmat ...

  2. Lua字符串库(整理)

    Lua字符串库小集 1. 基础字符串函数:    字符串库中有一些函数非常简单,如:    1). string.len(s) 返回字符串s的长度:    2). string.rep(s,n) 返回 ...

  3. Lua 学习之基础篇三<Lua 字符串操作>

    Lua字符串可以使用以下三种方式表示: 单引号间的一串字符. 双引号间的一串字符. [[和]]间的一串字符. string = [["Lua"]] print("字符串 ...

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

    Step By Step(Lua字符串库) 1. 基础字符串函数:    字符串库中有一些函数非常简单,如:    1). string.len(s) 返回字符串s的长度:    2). string ...

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

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

  6. lua 字符串

    lua 字符串 语法 单引号 双引号 "[[字符串]]" 示例程序 local name1 = 'liao1' local name2 = "liao2" lo ...

  7. cocos2d-x -Lua 字符串

    字符串或串(String)是由数字.字母.下划线组成的一串字符. Lua 语言中字符串可以使用以下三种方式来表示: 单引号间的一串字符. 双引号间的一串字符. [[和]]间的一串字符. 以上三种方式的 ...

  8. lua字符串

    本文内容基于版本:Lua 5.3.0 概述 Lua字符串中的合法字符可以是任何的1字节数据,这包括了C语言中表示字符串结束的'\0'字符,也就是说Lua字符串在内部将以带长度的内存块的形式存储,存储的 ...

  9. Lua学习九----------Lua字符串

    © 版权声明:本文为博主原创文章,转载请注明出处 1.Lua字符串 - ''单引号间的一串字符 - ""双引号之间的一串字符 - [[]]之间的一串字符 2.Lua转义字符 3.字 ...

随机推荐

  1. i3wm脚本

    exec 执行命令 --no-startup-id 有些脚本或者程序不支持启动通知,不加命令,鼠标会长时间空转,60秒左右 exec_always 每次重启i3,使用该命令启动的程序都会重新执行一次, ...

  2. SpringMVC拦截静态资源的解决方法

    本文中的各软件版本简要信息: IDE:Myeclise17 JDK:1.8.0_111 spring:5.1.8 springMVC:5.1.8 mybatis:3.2.2 Tomcat:9.0 在使 ...

  3. Luogu P2511 [HAOI2008]木棍分割 二分+DP

    思路:二分+DP 提交:3次 错因:二分写萎了,$cnt$记录段数但没有初始化成$1$,$m$切的次数没有$+1$ 思路: 先二分答案,不提: 然后有个很$naive$的$DP$: 设$f[i][j] ...

  4. luogu P4194 矩阵

    嘟嘟嘟 先二分. 令二分的值为\(mid\),则对于每一行都要满足\(|\sum_{i = 1} ^ {n} (A_{ij} - B_{ij})|\),把绝对值去掉,就得到了\((\sum_{i = ...

  5. 【luoguP1955 】[NOI2015]程序自动分析--普通并查集

    题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变 ...

  6. javascript数据结构之顺序表

    关于线性表的概念这里就不赘述了,可以自行百度和查阅资料,线性表按照存储(物理)结构分为顺序存储和链式存储,每种存储方式的不同决定了它的实现代码是不同的: 顺序存储的特点就是在内存中选一块连续的地址空间 ...

  7. koa 实现上传文件

    项目目录: 1.上传单个文件 思路: (1)获取上传文件,使用 const file = ctx.request.files.file (2)我们使用 fs.createReadStream 来读取文 ...

  8. 2.使用kubeadm快速搭建k8s集群

    准备工作: 时间同步 systemctl stop iptables.servicesystemctl stop firewalld.service 安装docker wget https://mir ...

  9. 几句java代码搞定十万个为什么数据

    最近想做一个app,为小朋友推荐十万个为什么的故事,但是找了很久数据,发现挺难的找的,又去写爬虫,发现没有一个好的网站可以爬,最后一个偶然的机会在csdn上发现一个可用的接口,很快就把问题解决了,下面 ...

  10. js 生成树以及关键字搜索生成树

    function main(keywords,data){ function fn(arr){ var flag = false; for(var i = 0;i <arr.length;i++ ...