zoukankan      html  css  js  c++  java
  • Lua 学习之基础篇三<Lua 字符串操作>

    Lua字符串可以使用以下三种方式表示:

    • 单引号间的一串字符。

    • 双引号间的一串字符。

    • [[和]]间的一串字符。

      string = [["Lua"]]
      print("字符串 是",string)
      --字符串 是	"Lua"
      

    Lua 提供很多内建方法支持字符串的操作:

    1. string.upper(argument):

      -->字符串全部转为大写字母

    2. string.lower(argument):

      -->字符串全部转为大写字母

    3. string.gsub(mainString,findString,replaceString,num)

      -->在字符串中替换,mainString为要替换的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换),返回的值是value+替换的length,如:

    string.gsub("aaaa","a","b",3);
     --bbba    3
    
    

    PS: gsub有一个重要的功能就是透过模式匹配过滤或者返回你想去除的字串,模式介绍参考下面拓展部分

    --实例1  对字符串中的每一个字母进行复制,并用连字符将复制的字母和原字母连接
    p,_= string.gsub("hello Lua!", "(%a)", "%1-%1")
    print(p)
    --h-he-el-ll-lo-o L-Lu-ua-a!
    
    --实例2 互换相邻的字符
    p,_=string.gsub("hello Lua", "(.)(.)", "%2%1")
    print(p)
    --ehll ouLa
    
    
    --替换掉字符里的字母a和尖括号
    local text = string.gsub(text, '[a<>]', '')
    --替换掉特殊的符号
    local text = string.gsub(text, "%[", "")
    local text = string.gsub(text, "%]", "")
    --也可以这样
    local text = string.gsub(text, "[%[%]]", "")
    
    1. string.find (s, pattern [, init [, plain]])**

    -->在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置,不存在则返回 nil,其中init 代表起始位置。

    print(string.find("test", 'es'))
     ----输出 2   3
    

    ​ 如果我们只想要 string.find 返回的第二个值, 可以使用 虚变量(即 下划线)

    _, q=string.find("test", 'es')
     print(q)  ---- 输出 3
    

    ​ 如果我们只想要 string.find 返回的第1个值,下划线代表当前return 变量, 对find进行赋值再打印即可

    q,_ = string.find("test", 'es')
    print(q)  ----输出2
    

    拓展-->字符串模式匹配

    pair = "name = Anna"
    _, _, key, value = string.find(pair, "(%a+)%s*=%s*(%a+)")
    print(key, value) 
    -- 输出 name Anna
    

    如果 find 的第二个参数使用了某种匹配模式, 并且模式串里面带括号。 那么表示会“捕捉”括号括起来的模式匹配到的字符串。 捕捉, 当然会把他们作为返回值。这里捕捉了两下, 所以 find 返回了两个值

    Lua支持的字符类有:

    . 任意字符
    %s 空白符
    %p 标点
    %c 控制字符
    %d 数字
    %x 十六进制数
    %z 代表0的字符
    %a 字母
    %l 小写字母
    %u 大写字母
    %w 字母数字

    字符类的大写形式代表相应集合的补集, 比如:%A 表示除了字母以外的字符集
    另外还有模式修饰符,* + - 三个,作为通配符分别表示:
    *: 匹配前面指定的 0 或多个同类字符, 尽可能匹配更长的符合条件的字串

    --先尽可能长的把本次匹配模式走完,再继续一下一个模式
    

    +: 匹配前面指定的 1 或多个同类字符, 尽可能匹配更长的符合条件的字串

    --匹配前一字符1次或者多次
    

    -: 匹配前面指定的 0 或多个同类字符, 尽可能匹配更短的符合条件的字串

    --本次匹配模式每走一步,就确认一下一个模式能否进入
    

    ? 匹配前一字符0次或1次
    ^ 匹配字符串开头
    $ 匹配字符串结尾

    模式串中的特殊字符
    ( ) . % + - * ? [ ^ $
    '%' 用作特殊字符的转义字符
    '%.' 匹配点;
    '%%' 匹配字符 '%'。
    转义字符 '%'不仅可以用来转义特殊字符,还可以用于所有的非字母的字符。当对一个字符有疑问的时候,为安全起见请使用转义字符转义他。
    用'[]'创建字符集
    '[%w_]' 匹配字母数字和下划线
    '[01]' 匹配二进制数字
    '[%[%]]'匹配一对方括号
    在'[]'中使用连字符'-'
    '%d' 表示 '[0-9]';
    '%x' 表示 '[0-9a-fA-F]'
    '[0-7]' 表示 '[01234567]'
    在'[]'开始处使用 '^' 表示其补集:
    '[0-7]' 匹配任何不是八进制数字的字符;
    '[^ ]' 匹配任何非换行符户的字符。
    '[^%s]' == '%S'

    于是, "(%a+)%s=%s(%a+)" 表示, 先匹配一个或多个字母, 然后是零个或多个空白符(比如空格), 然后是个 '=', 然后空白符, 然后字母。这样, 满足匹配的只有 "name = Anna"。 所以输出位置为 2 12.
    因为捕获了两个 (%a+), 也就是 name, Anna 这两个单词, 所以还输出了这两个单词
    另外, lua 使用 %1-%9 表示拷贝捕获

    捕获是这样一种机制:可以使用模式串的一部分匹配目标串的一部分。将你想捕获的模式用圆括号括起来,就指定了一个捕获

    s="abc "it's a cat""
    _,_,_,q=string.find(s, "(["'])(.-)%1")
    print(q)  -----输出: it's a cat
    

    首先, ["'] 表示匹配 双引号或者单引号, 因为有括号,所以引号被捕获。 然后匹配几个任意字符并且捕获他, 最后 %1 匹配与第一次捕获到的(即引号)相同的字串。所以整个模式匹配到的是 "it's a cat", 而第二次捕获的是去掉两头引号的字串, 即 it's a cat.

    '-' 与 '*' 到底有什么不同呢? 在上面, "(["'])(.*)%1" 匹配到的结果与 '-' 是一样的。尽可能匹配更长, 尽可能匹配更短 究竟什么不同呢?看例子:

    print( (""hello" "hello""):find('"(.+)"') )  ----输出 1 15 hello" "hello
    print( (""hello" "hello""):find('"(.-)"') )  ----输出 1 7 hello
    
    • * 尽可能长, 所以匹配了首尾两个 引号, 捕获了中间的 (hello" "hello)
    • - 尽可能短, 所以碰到第二个引号就说匹配完了, 因此只捕获了第一个 (hello)

      我们可以用string.find 搭配匹配字符获得我们想要的字串

    date = "17/7/1990"
    _, _, d, m, y = string.find(date, "(%d+)/(%d+)/(%d+)")
    print(d, m, y)      --> 17 7 1990  
    
    1. string.reverse(arg)

      —>字符串反转

      string.reverse("Lua")
      --auL
      
    2. string.format(...)

      返回一个类似printf的格式化字符串

    string.format("the value is:%d",4)
    --the value is:4
    
    1. string.char(arg) 和 string.byte(arg[,int])

      char 将整型数字转成字符并连接, byte 转换字符为整数值(可以指定某个字符,默认第一个字符)。

    > string.char(97,98,99,100)
    abcd
    > string.byte("ABCD",4)
    68
    > string.byte("ABCD")
    65
    
    1. string.len(arg)

      计算字符串长度

    string.len("abc")
    --3
    
    1. string.rep(string, n)

      回字符串string的n个拷贝

    string.rep("abcd",2)
    abcdabcd
    
    1. string.gmatch(str, pattern)

    return一个迭代器函数,每一次调用这个函数,会返回一个在字符串 str 找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到,迭代函数返回nil。

    for word in string.gmatch("Hello Lua user", "%a+")
      do
       print(word)
      end
    Hello
    Lua
    user
    
    1. string.match(str, pattern, init)

    string.match()只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。

    在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil。

    local path = "c:/home/test/1.txt"
    local name = string.match(path, ".+/(.+)")
    print("name:", name)
    --1.txt
    
     string.match("I have 2 questions for you.", "%d+ %a+")
    --2 questions
    
     string.format("%d, %q", string.match("I have 2 questions for you.", "(%d+) (%a+)"))
    --2, "questions"
    
    
    1. string.sub(str,i[,j])

    用于字符串截取,返回截取长度的字符串(区间为闭)

    a = "abc1test 123"
    print (string.sub(a,2))
    --bc1test 123
    print (string.sub(a,2,4))
    --bc1
    
  • 相关阅读:
    Centos 6.9 安装 Redis 3.2.9
    CentOS下安装JDK的三种方法
    centos6.9(Linux系统)安装VMware tools教程
    VMWare安装Centos 6.9
    关于缓存中Cookie,Session,Cache的使用
    MVC控制器获取@Html.DropDownList值
    .net下的跨域问题
    IIS无法加载字体文件(*.woff,*.svg)的解决办法
    jQuery .attr("checked")得undefined 问题解决
    Apache和IIS服务器共存问题来自网上内容
  • 原文地址:https://www.cnblogs.com/xiaoqiangink/p/12082726.html
Copyright © 2011-2022 走看看