字符分类模式

  • 模式中能够一个特定集合中的任意字符相匹配的一项
    • 如:模式:”%d%d/%d%d/%d%d%d%d”来匹配dd/mm/yyyy | 字符分类及其对应 | | | —- | —- | | . | 所有字符 | | %a | 字母 | | %c | 控制符 | | %d | 数字 | | %g | 除空格外的可打印字符 | | %l | 小写字母 | | %p | 标点符号 | | %s | 空格符号 | | %u | 大写字母 | | %w | 字母和数字 | | %x | 十六进制 | | %z | 用0表示的字符 | | %b | 匹配成对的字符串;语法为’%bxy’,如%b()匹配(开始,)结束的一对字符串(会匹配对应的一对) | | %f[char-set] | 匹配后一个字母在[char-set]内而前一个字母不在[char-set]内的字符,
      如:%f[%w] 匹配后一个字母不是数字或字母,前一个字符时数字或字母,如ab_中的b |
  • 注:这些类的大写形式表示类的补集

    • 如:’%A’代表任意非字符的字符

      魔法字符

  • 魔法字符内容:( ) . % + - * ? [ ] ^ $

    • 使用 %魔法字符 可以在模式中匹配魔法字符
      • 如:%( → ( %% → %
  • 模式最后使用$表示匹配到字符串结尾
  • 模式开头使用^表示匹配从字符串头开始

    • 如:^[+-]?%d+$ 表示字符串是没有多于前缀和后缀的整数
    • 注:^和$只有在开头和结尾有作用,其余位置只代表^

      字符集([内容])

  • [ ] 内为一个字符集,会匹配所有满足集合中的字符

    • 如:[%w_] 匹配 字符、数字和_
      • 如:在”1[a]b 23”中会匹配1 a b 2 3
  • 使用 - 包含范围
    • 如:[0-9] 匹配0~9之间的所有字符[a-zA-F] 匹配a~zA-F的所有字符
  • 在字符前使用 ^取得对应的补集(只有在字符集中有此作用)

    • 如:[^0-7] 取得0~7外的字符;[^%d_] 取得数字_外的字符
    • 注:大写的字符分类也是取得补集。%A

      重复和可选部分的修饰符

  • 如:%a+ 代表匹配一个多个字母(一个单词);%d+ 代表匹配一个多个数字(一个整数) | 修饰符 | | | —- | —- | | + | 重复一次或多次 | | | 重复零次或多次;(最长匹配);**匹配可选的空格’%(%s%)’匹配()或( ) | | - | 重复零次或多次(最小匹配);如:[%a][%w]-中的[_%w]-总是会匹配空序列**, | | ? | 可选(出现零次或一次);如:[+-]? 代表+-是可选的 |

捕获机制:()的使用

  • 根据一个模式从目标字符串中抽出与该模式匹配的内容通过模式中将需要捕获的部分放到一对()指定捕获

    1. pair = "name = Anna"
    2. key, value = string.match(pair, "(%a+)%s*=%s(%a+)")
    3. --模式匹配了name = Anna,但由于使用了()只捕获了()中的内容
    4. print(key, value)

    %n的使用(n为数字)

  • %n重复第n个捕获到的内容

    • 也就是第n个()捕获到的内容
      s = [[then he said:"it's all rigth"!]]
      q, quotedPart = string.match(s, '(["\'])(.-)%1')    
      --%1代表第一个捕获的到内容,也就是第一个()的内容:"
      print(q, quotedPart)
      

      gsub中使用%n

  • 发生替换时,%n同样代表着第n个捕获到的内容

    • 注:%0代表整个匹配
      str = "hello world"
      print(string.gsub(str, "%a", "%0-%0"))    --代表将每个匹配到的字符,替换成:字符-字符的模式
      --输出:h-he-el-ll-lo-o w-wo-or-rl-ld-d 10
      print(string.gsub(str, "(.)(.)", "%2%1"))    --将每次匹配到的字符位置进行替换:ab → ba
      --输出:ehll oowlrd     5
      

      空()的使用

  • 空的()→空白捕获 有其特殊含义:捕获模式在目标字符串中的位置

    • 在之前是开始位置,在之后是后一个位置
      • 如:”12345”中,string.match(str, “()1”)输出1;string.match(str, “5()”)输出6

替换(gsub的第三个参数)

  • gsub的第三个参数可以为表

    • 替换时,会先捕获匹配的内容,然后将捕获内容对应表中的键值对进行替换,如果该键值对为nil不替换
      str = "$world name is $hello $mark"
      t = {world = "My", hello = "yxf"}    
      print(string.gsub(str, "$(%w+)", t))    --匹配搜索$开头的字母,并用t中的键值对进行替换    
      --输出:My name is yxf $mark    3
      
  • gsub的第三个参数可以为函数

    • 替换时,每个捕获内容都会被带入函数,第几个捕获的内容就对应函数的第几个参数
      str = "$world name is $hello $mark"
      t = {world = "My", hello = "yxf"}
      print(
      string.gsub(
         str,
         "$(%w+)",
         function(n)
             return tostring(t[n])
         end
      )
      )    --每个捕获的&(var)都会被带入function(n)中,处理成要替换的结果,第几个捕获就对应第几个参数
      --输出:My name is yxf nil      3
      

      实例

      去除字符两端的空格

  • string.gsub(s,”^%s(.-)%s$”,”%1”)

    实现split(str,separator)

  • string.format(“([^%s]+)”, separator)