模式匹配快速入门的九个要点
编辑时间:2021-09-10 作者:金满斗 浏览量:1735 来源:原创

一、模式匹配高手,不会是编程高手


模式匹配很多时候可以高效简洁的解决问题,但凡事过犹不及,请记住不要把模式匹配写的太复杂,不要深陷其中,把所有想做的事放到一个匹配表达式中,指望用模式匹配解决一切麻烦,通常会给自己带来更多不必要的麻烦。

模式匹配不是用来编写复杂程序的,编写程序应当用编程语言,当你试着用程序代码解决匹配问题,你会发现简洁并不总是最好的,自己编程分析匹配文件不但更容易,而且后期维护也会省心的多。

二、你只要记住一个模式匹配语法就入门了


例如:

var s = string.match("abcd123456","[0123456789]+?")

[0123456789] 仅匹配一个字符,这个字符可以是0123456789中的任意一个。你也可以简略的写为[0-9] ASCII码表中表示0到9之间的所有字符, [01230-9]与 [0-9] 表示的含义是相同的。类似的还有[a-z],或者[A-Z]当然,你也可以写在一起,例如[0-9a-zA-Z]匹配所有数字与字母。

而+是一个修饰符,表示匹配1次或任意多次,如果把+换成*,就表示匹配0次或任意多次,
你还可以显式的指定到底要匹配多少次,例如

var s = string.match("abcd123456","[0-9]{2,5}?")

这里表示数字最少匹配出现2次,最多连续匹配5次.

无论是[0-9]+,[0-9]*,还是[0-9]{2,5}, 这些修饰符都是贪婪的,他们都是贪婪匹配,或者尽可能的最长匹配尽可能多的字符。如果再在这些修饰符后面加一个问号,他就会尽可能获取最短的匹配结果。

三、你不需要记住所有模式语法


如果你经常遗忘模式语法,那么恭喜你,你有一个高效率并负责任的大脑。实际上,你可以在aardio工具里打开『模式匹配工具』,常用的语法一目了然,如果你实在记不住,可以去问别人,当然,如果你最近的工作主要就是以模式匹配为主,那么这时候你可能要去认真啃一遍帮助文档了。

四、匹配任何标点符号,请在前面加上反斜杠


var s = string.match("abcd,,,,","\,")

如果你不加反斜杠转义,标点符号通常是具有特殊的含义的模式语法符号,例如"."匹配任意字节,":"匹配任意多字节汉字,如果你只是想匹配真正的":"号,那么请写为"\:"。就连"\"转义符本身也一样,如果你要查找的就是"\"那么请在模式表达式中写为"\\",,例如:

var s = string.match("abcd\,,,,","\\")

即使一个标点符号不是模式符号,没有特殊含义,你在前面加上一个反斜杠都没有问题。

五、永远都不要把模式匹配表达式包含在单引号中


你可以把模式表达式放在双引号中,如果你的模式表达式本身就有双引号,那么你可以把他放在反引号中(反引号指的是键盘左上角ESC下面的那个符号)

但千万不要放在单引号中, 因为:

包含在单引号中的\本来就是转义符,要用 '\\' 表示模式匹配转义符"\",这通常会让新手混乱。

六、请记住模工匹配是基于二进制的以字节为单位,兼容UTF-8编码文本


aardio10中文本默认是UTF8编码,模式匹配也兼容UTF-8编码,如果你的文本不是UTF-8编码,请先用 string.fromto(str,0,65001)转换为UTF8编码。

记住,模式匹配以字节为单位,汉字有多个字节(通常是三个字节),部份模式匹配函数可以在参数中指定返回值以字符个数计数,例如string.find

七、如果你不想用[]匹配一个字符,而是想匹配一串字符,那么请使用<>


例如:

 var s = string.match("abcd,,,,","<cd>")

记住[cd]匹配c或d,而 匹配"cd"

八、如果你想暂时禁用模式匹配语法,那么请放在 <@中间@>


例如:

var s = string.match("abcd,,,,","<@abcd,@>")

如果同时还希望忽略大小写,那么再加一个@,例如

var s = string.match("abcd,,,,","<@@Abcd,@>")

九、()后面不能放修饰符 + * 等等


圆括号可以增加匹配分组,也就是增加模式匹配的返回值个数,便你不能在圆括号后面用修饰符指定该分组能匹配多少次。

你不能写

  var ab,cd = string.match("abcdcd,,,,","(ab)(cd)+")

但是可以写 +

 var ab,cd = string.match("abcdcd,,,,","(ab)(<cd>+)")

来说两句吧