zoukankan      html  css  js  c++  java
  • 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(十六进制数字)
      特殊字符们: (  )  .  %  +  -  *  ?  [  ]  ^  $
      普通字符串,用来转义: ‘
    ’

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

    但是,尝试了一下这种情况:  string.find( s , ‘^[+-]?%d+$’ )

    依然能够匹配出字符串前面的+-号,当然  string.find( s,‘[%+%-]?%d+’)

    也能够匹配出结果。所以,建议使用后者,含义比较清晰。

      字符集: [%w_]  [AEIOUaeiou]  [0-9A-Fa-f]  [^
    ]  [^%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 比较宽松。

  • 相关阅读:
    kubernetes中跨namespace的服务调用 & 外部服务调用 & host配置
    pm2 ——带有负载均衡功能的Node应用的进程管理器
    Linux——docker启用配置:dockerfile——ubuntu
    .net core 单元测试——sonar
    Linux——工具参考篇(3)——ps 进程查看器
    开发框架
    Django框架 + Djiango安装 + First Djiango + 常用命令
    计算机网络知识点随机整理
    Ubuntu tricks
    Python 图片Resize.py
  • 原文地址:https://www.cnblogs.com/guangyun/p/5241327.html
Copyright © 2011-2022 走看看