(转载)lua的字符串及字符串格式化

原文链接

字符串的表示

  • ""
  • ''
  • [[]]
  • 被以上三项框起来的内容即为string, 当选用其上的任意一种方式来表示字符串的时候,如果要字符串中包含它本身的符号,则需要转义。

    举个例子: print("'I love Crane_Moker'") 输出:‘I love Crane_Mocker’
    而 print(""lua is a nice language"") 则会报错
    print("\"single dog\"") 输出"single dog"

    string.format()

    这个函数类似于lua他妈妈,c语言中的printf(),提供了格式化的选择
    举个例子: print(string.format("Happy %d", 1024)) 输出:Happy 1024
    注意,这里字符串"Happy 1024"是执行了函数string.format()的返回值,要想在终端显示它,还需要print()

    参数解释
    %c 接受一个数字, 并将其转化为ASCII码表中对应的字符
    %d, %i 接受一个数字并将其转化为有符号的整数格式
    %o 接受一个数字并将其转化为八进制数格式
    %u 接受一个数字并将其转化为无符号整数格式
    %x 接受一个数字并将其转化为十六进制数格式, 使用小写字母
    %X 接受一个数字并将其转化为十六进制数格式, 使用大写字母
    %e 接受一个数字并将其转化为科学记数法格式, 使用小写字母e
    %E 接受一个数字并将其转化为科学记数法格式, 使用大写字母E
    %f 接受一个数字并将其转化为浮点数格式
    %g(%G) 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种格式
    %q 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
    %s 接受一个字符串并按照给定的参数格式化该字符串

    这里还有在%之后以控制格式的参数

    参数解释不带该参数的默认情况
    + 其后的数字转义符将让正数显示正号 只有负数显示符号
    0 指定了字串宽度时用0占位 空格占位
    - 左对齐 右对齐
    (m).(n) m字串裁切位数,n小数保留位数  

    匹配模式

    string.gmatch(str, pattern)和string.match(str, pattern, init)

    string.gmatch()有迭代器,可以匹配目标str中的所有符合pattern要求的部分(在for循环之类的里面使用这个会是不错的选择)。
    而string.match()则只能匹配第一个,init决定了开始匹配的位置,默认是1(不要忘记了,在lua的table中默认以1开始哦)

    匹配的pattern ?

    参数匹配
    .(点) 与任何字符配对
    %a 与任何字母配对
    %c 与任何控制符配对(例如\n)
    %d 与任何数字配对
    %l 与任何小写字母配对
    %p 与任何标点(punctuation)配对
    %s 与空白字符配对
    %u 与任何大写字母配对
    %w 与任何字母/数字配对
    %x 与任何十六进制数配对
    %z 与任何代表0的字符配对
    %x(此处x是非字母非数字字符) 与字符x配对. 主要用来处理表达式中有功能的字符(^$()%.[]*±?)的配对问题, 例如%%与%配对
    [数个字符类] 与任何[]中包含的字符类配对. 例如[%w_]与任何字母/数字, 或下划线符号(_)配对
    [^数个字符类] 与任何不包含在[]中的字符类配对. 例如[^%s]与任何非空白字符配对

    lua中特殊字符有( ) . % + - * ? [ ^ $, 所以匹配是就需要%来转义,即上表中的%x

    模式条目

    符号涵义
    * 将匹配零或多个该类的字符。 这个条目总是匹配尽可能长的串
    + 将匹配一或更多个该类的字符。 这个条目总是匹配尽可能长的串
    - 将匹配零或更多个该类的字符。 和 ‘*’ 不同, 这个条目总是匹配尽可能短的串
    ? 将匹配零或一个该类的字符。 只要有可能,它会匹配一个
    %n 这里的 n 可以从 1 到 9; 这个条目匹配一个等于 n 号捕获物(后面有描述)的子串。
    %bxy 这里的 x 和 y 是两个明确的字符; 这个条目匹配以 x 开始 y 结束, 且其中 x 和 y 保持 平衡 的字符串。 意思是,如果从左到右读这个字符串,对每次读到一个 x 就 +1 ,读到一个 y 就 -1, 最终结束处的那个 y 是第一个记数到 0 的 y。 举个例子,条目 %b() 可以匹配到括号平衡的表达式。
    %f[set] 指 边境模式; 这个条目会匹配到一个位于 set 内某个字符之前的一个空串, 且这个位置的前一个字符不属于 set 。 集合 set 的含义如前面所述。 匹配出的那个空串之开始和结束点的计算就看成该处有个字符 ‘\0’ 一样。

    上面这个表是什么意思呢?不妨让我用*和+为大家举个例子:

    print(string.match("Hello 1024", "%d")) 我们知道,string.match只匹配匹配到的第一个,所以这里可以匹配到符合pattern的部分,也就是在该字符串中的第一个数字1,所以输出为 1

    print(string.match("Hello 1024", "%d+")) , 加号使条目尽可能长,所以这里输出为1024

    print(string.match("Hello 1024", "%d*")), 由于*可以匹配到0个或多个该类字符,在这个字符串里,当然是先遇到了H,所以这里没有输出

    print(string.match("1024Hello", "%d*")), 就可以愉快输出1024啦

    顺嘴一提 string.char(arg) 和 string.byte(arg[,int])

    string.char()有一个或多个参数,顾名思义,是将数字转化为字符,当然,它可以将它们连起来,成为str

    string.byte()则将字符串的第指定(init)个字符返回对应的ascii码,默认是第一个

posted @ 2022-05-15 15:39  青丝·旅人  阅读(987)  评论(0编辑  收藏  举报