zoukankan      html  css  js  c++  java
  • Chapter 21_4 捕获

      捕获功能在很多地方都在使用,就是从目标字符串中抽出匹配于该模式的内容,在指定捕获时,应将模式中需要捕获的部分写到一对圆括号内

    对于具有捕获的模式,函数match会将所有捕获到的值作为单独的结果返回。即它会将目标字符串切成多个捕获到的部分:

    pair = "name = Anna"
    key,value = string.match(pair,"(%a+)%s*=%s*(%a+)")
    print(key,value)            --> name Anna

    %a+模式表示一个非空的字母序列,"%s*"表示一个可能为空的空格序列。

    上例模式中的两个字母序列的内容分别放在括号中,下面是一个类似的例子:

    date = "today is 26/9/2016"
    d,m,y = string.match(date,"(%d+)/(%d+)/(%d+)")
    print(d,m,y)    -->26  9  2016

      在模式中,可以对模式本身使用捕获,像%d,这里的d是一个只有一位的数字,表示只匹配与第d个捕获相同的内容。

    假设在一个字符串中寻找一个由单引号或双引号括起来的子串。那么可以:

    '["'].-["']'

    但是在遇到"it's all right"这样的字符串就有问题了,所以上面的%d模式就有用武之地了:

    s = [[then he said:"it's all right"!]]
    q,quotePart = string.match(s,"(["'])(.-)%1")   --第一个括号表示捕获引号字符本身,第二个括号表示捕获引号中的内容,即与".-"相匹配的子串。
    print(q)            --> "
    print(quotePart)    --> it's all right

    又如,匹配Lua中的长字符串:

    %[(=*)%[(.-)%]%1%]

    它匹配的内容依次是:一个左方括号、0或多个"="、另一个方括号、任意内容(字符串的内容)、一个右方括号、相同数量的等号及另一个右方括号:

    p = "%[(=*)%[(.-)%]%1%]"
    s = "a = [=[[[ something ]] ]==] ]=];print(a)"
    print(string.match(s,p))  --> =            [[ something ]]  ]==]

    第一个捕获是等号序列,本例的等号序列中只有一个等号。

    第二个捕获是字符串的内容。

    对于捕获到的值,还可用于gsub函数的字符串替换。和模式一样,用于替换的字符串中也可以包含"%d"这样的项。当进行替换时,这些项就对应于捕获到的内容。

    "%0"表示整个匹配,并且替换字符串中的"%"必须被转移为"%%"。下面这个示例会重复字符串中的每个字符,并且在每个副本之间插入一个减号:

    print(string.gsub("hello Lua!","%a","%0-%0")) --%a表示匹配字母,将h替换为h-h
    -->h-he-el-ll-lo-o L-Lu-ua-a!      8

    下例交换了所有相邻的字符:

    print(string.gsub(hello Lua","(.)(.)","%2%1"))
    -->ehll ouLa

      一个更有用的示例,格式转换器,它能读取用LaTeX风格书写的命令字符串,例如:

    command{some text}

    并将它转换为XML风格的格式:

    <command>some text</command>

    不处理嵌套的命令,用下面的代码可以完成该工作:

    s = [[the quote{task} is to em{change} that.]]
    s = string.gsub(s,"\(%a+){(.-)}","<%1>%2</%1>")
    print(s)
    --> the <quote>task</quote> is to <em>change</em> that.

    最后一个示例,如何剔除字符串两端空格的示例:

    function trim(s)
        return (string.gsub(s,"^%s*(.-)%s*$","%1"))  --用括号是强制丢弃多余的结果,只保留一个结果。
    end

    "^%s*" 表示匹配前端的所有空格。

    "%s*$" 表示匹配后端的所有空格。

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

  • 相关阅读:
    移动端页面滚动性能调优
    外盘期货交易安全吗
    Vuetify的pagination功能踩坑
    oh-my-zsh自定义主题
    SSM整合
    Spring底层学习 1
    Node.js+Express day01
    JS+DOM conclusions
    tables+form+validation+Semantic HTML
    mybatis-利用association和collection实现一对一和一对多
  • 原文地址:https://www.cnblogs.com/daiker/p/5909973.html
Copyright © 2011-2022 走看看