zoukankan      html  css  js  c++  java
  • lua的string库与强大的模式匹配

    lua原生解释器对字符串的处理能力是十分有限的,强大的字符串操作能力来自于string库。lua的string函数导出在string module中。在lua5.1,同一时候也作为string类型的成员方法,因此,我们既能够写成string.upper(s), 也能够s:upper(),选择你喜欢的写法。

    string.len(s)返回s的长度。
    string.rep(s, n)返回反复s字符串n次的字符串。
    string.lower(s)返回一份已将大写转成小写的字符串s的拷贝 
    lower,upper都是使用本地字符集的,另外,假设你想对一个string数组进行排序,并不区分大写和小写,你可能像这么写:
    table.sort(a, function(a, b)
         return string.lower(a) < string.lower(b)
    end)

    string.sub(s, i, j)将从s提取一段字符串,从i到j(闭区间[i, j]),当然你能够使用负索引值,将从字符串尾部算起,-1是最后一个字符,-2是倒数第二,等等,这么做的优点是当我们要提取直到末尾几个字符时,从后面数起就非常方便。比如:
    s = "[hello,world]"
    print(string.sub(s, 2, -2)) --> hello,world

    记住,lua中的字符串是不可变的。

    string.char, string.byte用于转换字符和对于的数字之间值。比如:
    i = 97
    print(string.char(i, i+1, i+2)) --> abc
    print(string.byte("abc"))       --> 97
    print(string.byte("abc"), -2)   --> 98

    lua5.1 string.byte能够接受第三个參数,返回i,j之间的多个值。比如,这么写将字符串转成字符值数组:
    t = {s.byte(1, -1}
    要想又一次转成字符串的话:
    string.char(unpack(t))

    string.format是强大字符串格式化函数,和c语言的printf类似,这里不累述。

    lua string库里最强大的函数是那些模式匹配函数:find, match, gsub, gmatch。和其它脚本语言不同,lua既没实用POSIX的正則表達式,也没实用perl的正則表達式。原因是实现这些导致lua占用很多其它内存,而lua的初衷是小巧的,嵌入应用的语言。 lua用少于500行的代码实现了自己的一套模式匹配,尽管不如标准的正則表達式强(一般须要4000以上代码),但也足够强大。

    string.find将查找目标模板在给定字符串中出现的位置,找到返回起始和结束位置,没找到返回nil。比如:
    s = "hello,world"
    i, j = string.find(s, "hello")
    print(string.sub(s, i, j))
    当然,string.find还能够给定起始搜索位置,当你想找出全部出现的位置时,这个參数就非常实用,比如想知道换行符出如今那些地方:
    local t = {}
    local i = 0
    while true do
         i = string.find(s, " ", i+1)
         if i == nil then break end
         t[#t+1] = i
    end

    string.match和string.find类似,都是在指定的string中查找对应的模式。不同的是,他返回的是找到的那部分string:
    print(string.match("hello,world","hello")) --> hello
    对于像"hello"这种固定模式来说,这个函数就没啥意义了。可是对于可变模式来说,就显示出他的强大威力了:
    date = "now is 2014/10/6 17:58"
    d = string.match(date, "%d+/%d+/%d+")
    print(d)   --> 2014/10/6

    string.gsub有三个參数,给定字符串,匹配模式和替代字符串。作用就是将全部符合匹配模式的地方都替换成替代字符串。并返回替换后的字符串,以及替换次数。
    s = string.gsub("Lua is cute", "cute", "great")
    print(s) --> Lua is great

    string.gmatch函数将返回一个迭代器,用于迭代全部出如今给定字符串中的匹配字符串。

    模式:
    字符类:(character classes)
    . all characters
    %a letters
    %c control characters
    %d digits
    %l lower -case letters
    %p punctuation characters
    %s space characters
    %u upper-case letters
    %w alphanumeric characters
    %x hexadecimal digits
    %z the character whose representation is 0

    他们的大写版本号是他本身的互补。
    魔法字符:
    ( ) . % + - * ? [ ] ^ $
    用%进行转义。'%%'代表'%'

    字符集(char -set ):使用字符集能够自己定义字符类。
    1.不同的字符类,和单字符之间用[]
    [%w_]匹配字母数字字符和下划线。
    [01]匹配二进制数
    2.要想字符集内包括字符区间,起止之间加上-
    [0-9] 相当于 %d
    [0-9a-fA-F]相当于 %x
    3.假设想得到该字符集的互补,前面加上^
    [^0-7] 不论什么非八进制数字

    反复或可选修饰符
    + 1 or more repetitions,匹配最长的,
    * 0 or more repetitions  最长的
    - also 0 or more repetitions 最短的
    ? optional (0 or 1 occurrence) 

    捕获
    捕获机制同意一个模式串中的一部分来匹配目标串种的一部分。写法是模式串中你须要捕获的那部分用()括起来,比如:
    pair = "name = anna"
    key, value = string.match(pair, "(%a+)%s*=%s*(%a+)")
    print(key, value) --> name anna
    我们也能够将捕获用于模式串自身,"(["'])(.-)%1",这里的%1表示匹配第一个捕获的一份拷贝。

    替换
    前面已知道,string.gsub的參数能够是string,事实上,也能够是个函数,或是table,假设是函数,就会用捕获的内容作为參数调用该函数,将返回的内容作为替换字符串。假设是table,则用捕获的内容为key去取table的值来作为替换字符串,假设不存在,就不做替换。如:
    function expand(s)
         return string.gsub(s, "$(%w+)", _G)
    end
    name = "Lua"; status = "great"
    print(expand("$name is $status, isn't it?"))

    (完)
  • 相关阅读:
    读github,deepfm,pytorch源码 记录
    郭盛华技术有多牛?外媒:稳坐亚洲第一
    新的TLS攻击让黑客可以对安全站点发起跨协议攻击
    Office发现4个安全漏洞,黑客可执行恶意代码
    拒绝百万年薪的郭盛华,如今自立门户,再创辉煌!
    谷歌浏览器帮助用户在安装前识别不受信任的扩展
    VM虚拟机发现严重的RCE漏洞!修复方法
    西门子新漏洞,黑客可远程执行恶意代码
    Nagios 网络监控软件曝出严重漏洞,可被黑客劫持
    Chrome浏览器附带一键式受损密码重置功能
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4047844.html
Copyright © 2011-2022 走看看