前言

开始尝试着解决一些实际问题,在学的过程中,有些知识点和以前理解的不一样,或者以前理解的正则规则就错了。刚好要用到提取网页数据,把aardio的模式匹配入门过了一遍。

要在实践中去掌握知识。

知识是从来不能脱离实践的,例如贪婪匹配,逻辑匹配,你为什么不用学?你碰到了实际的需要,你会想:要是这里能……多好啊? 你一查,还真有呢,你马上就懂了,几乎就是闪电的时间你就明白了,这就是实践中碰撞出来的知识火花。

– 《模式匹配快速入门》

修饰符

  1. . :任意字符/字节( 与正则表达式相同 )
  2. : :任意双字节( 中文字符,正则表达式无此语法 )
  3. *,+ :星号表示出现0到任意次,加号则表示出现1次到任意次
  4. ^,& :字符串开始和结束
  5. [] :匹配指定字符中的某个
  6. () :圆括号设定模式匹配返回的结果,每增加一对圆括号,匹配函数就多一个返回值 「新知识√」
  7. <> :字符串匹配,匹配尖括号中的整串字符
  8. {} :大括号指定模式重复匹配的次数
  9. % :对称匹配

其他预定义字符

  1. \n :换行符
  2. \r 回车符
  3. \w 字母和数字
  4. \s 空白符
  5. \d 数字
  6. \f 换页符 \x0c
  7. \v 匹配一个垂直制表符。等价于 \x0b
  8. \t 制表符

以上部分与正则表达式兼容,以下是 aardio 模式匹配特有:

  1. \a 字母
  2. \c 控制字符
  3. \i 是否ASCII字符( 字节码 < 0x80 )
  4. \l 小写字母
  5. \p 标点字符
  6. \u 大写字母
  7. \x 十六进制数字(正则表达式里用于16进制字符前缀,即 \xhh
  8. \z 表示 \0

大写表示反义( 与正则表达式相同 ),例如\D表示不是数字的字符。

修饰符示例

指定一个模式应当怎样去匹配。修饰符有很多种,而最常用的就是用来指定匹配次数。

p{2,3} 表示 a 出现 23

1
2
3
io.open()
结果 = string.match("12345678","\d{2,5}")
io.print( 结果 ) //显示 12345

p+ 表示 a 出现 1 次到任意次数,等价于 p{1,}

1
2
3
io.open()
结果 = string.match("12345678","\d+")
io.print( 结果 ) //显示 12345678

p* 表示 a 出现 0 次到任意次数,等价于 p{0,}

1
2
3
io.open()
结果 = string.match("12345678","\d+\s*") //这里的"\s*"匹配零个或多个空格
io.print( 结果 ) //还是显示 12345678

匹配身份证的例子

匹配身份证示例及更完整的教程,请参考aardio官方教程: 模式匹配快速入门