• Chapter 21_1 字符串函数


      接下来开始接触Lua强大的字符串处理能功能——字符串库。

      原始的Lua解释器操作字符串的能力很有限,真正强大的能力还是来自字符串库。

      它所有的函数都在模块string中。它还为strings设置了一个元表,__index域指向该string table。

      所以string.byte(s,i)可以使用s:byte(i)这种面向对象的写法。

      string.len(s)可以返回字符串s的长度;等价于 #s。

      string.rep(s, n) 或s:rep(n) 可以返回字符串s重复n次的结果:

    string.rep("a", 2^20)    --创建1M的字符串

      string.lower(s) 可以返回一份s的副本,其中所有的大写字母都被转换成小写形式,其他字符不变。string.upper与之相反。

      比如对一个字符串数组排序,并且不区分大小写:

    table.sort(a , function(a, b)
        return a:lower() < b:lower()
    end)
    
    -- or
    
    table.sort(a , function(a ,b)
        return string.lower(a) < string.lower(b)
    end)

      string.sub(s , i, j)可以从s中 截取第i个到第j个字符。Lua中第一个字符的索引是1

      也可以使用负数作索引,这样就是从字符串尾部开始计数,-1表示最后一个字符,-2表示倒数第二个。

    string.sub(s,1, j)        -->得到字符串中长度为j的前缀。
    s:sub(1,j)                -->同样得到字符串中长度为j的前缀。
    
    string.sub(s , j, -1)    -->得到从第j个开始的后缀。
    s:sub(j)                 -->也是得到第j个开始的后缀。
    
    string.sub(s,2,-2)     -->可以返回字符串去掉第一个和最后一个字符的串
    s = "[in brackets]"
    print(s:sub(2,-2))      --> in brackets

      Lua中的字符串是不可变的,和Lua中所有其他函数一样,string.sub不会改变字符串的值,只会返回一个新字符串:

    string.sub(s , 2 , -2)        -- 光这样是不能改变s的值的
    s = string.sub(s , 2 , -2)    -- 这样s的值才会改变

      string.char和string.type是用于转换字符及其内部数值表示。前者接受0或多个整数,并将每个整数转换成对应的字符,然后返回一个字符串。

    print(string.char(97))        --> a
    i = 97;print(string.char(i , i+1 , i+2 )) -->abc

      string.byte(s , i )返回字符串s中第i个字符的内部数值表示,它的第二个参数是可选的;

      调用string.byte(s)可返回字符串s总第一个字符的内部数值表示:

    print(string.byte("abc"))       --> 97
    print(string.byte("abc",2))     --> 98
    print(string.byte("abc",-1))    --> 99

      string.byte(s , i , j)可以返回索引i到j之间的所有字符的内部表示值。

    print(string.byte("abc", 1 , 2 ))   --> 97 98

      j 的默认值是 i ,如果不指定j,就只返回第 i 个字符的值。

      有一中习惯写法是:

    {s:byte(1 , -1 ) }

      这种写法会创建一个table,其中包含了s中所有字符的编码。然后可以用string.char(unpack(t))来重建原字符串。

    但是由于Lua限制了函数的返回值数量,所有这项技术无法用于较长的字符串(大于1MB)。

      stirng.format用于格式化字符串的利器,常用在输出上。它会根据第一个参数的描述,返回后续其他参数的格式化版本,这第一个参数也称为“格式化字符串”。编写格式化字符串的规则与标准C中printf函数相同。

    一个由字符“%”加上一个字母组成,字母有:

    d  用于十进制

    x  用于十六进制

    o  用于八进制

    f  用于浮点数

    s  用于字符串

    此外,在%与字母之间还可以再指定一些其他选项

    print(string.format("pi %.4f ",math.pi))        --> pi = 3.1416  表示一个小数点后有4位
    d = 5;m = 11; y = 1990
    print(string.format("%02d/%02d/%04d",d , m ,y)) --> 05/11/1990  02表示一个十进制数至少2位,不足用0凑。 %2d 表示用空格来凑。
    tag , title = "h1" , "a title"
    print(string.format("<%s>%s</%s>", tag , title , tag ))
    --> <h1>a title</h1>

    以上内容来自:《Lua程序设计第二版》和《Programming in Lua  third edition 》

  • 相关阅读:
    为什么为 const 变量重新赋值不是个静态错误
    带有“非简单参数”的函数为什么不能包含 "use strict" 指令
    arguments 对象的老历史
    去掉你代码里的 document.write("<script...
    SameSite Cookie,防止 CSRF 攻击
    扼杀 304,Cache-Control: immutable
    V8 的 typeof null 返回 "undefined" 的 bug 是怎么回事
    IntersectionObserver API
    passive 的事件监听器
    esnext:最后一个参数后面也允许加逗号了
  • 原文地址:https://www.cnblogs.com/daiker/p/5893131.html
Copyright © 2020-2023  润新知