打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【知识】模式匹配基础篇
【知识】模式匹配基础篇
一。模式匹配基本函数
1.1 string.match()
格式:
string.match(str, pattern)

第一个参数指定目标字符串,每二个参数指定查找模式串。返回找到的一个或多个分组捕获。

1.2 string.gmatch()
格式:
func = string.gmatch(str, pattern)

全局模式匹配io.print(type(m1)) 函数比较适合用于泛型for循环。它可以遍历一个字符串内所有匹配模式的子串。
调用string.gmatch函数的时候,如果不显示的指定捕获,函数将捕获整个匹配模式。

二。模式匹配基本规则

2.1 模式
2.1.1 字面值(普通字符)


没任何修饰符,即是说a表示a, b表示b,1表示1。。。字面是什么就表示什么,表达式中的普通字符在匹配一个字符串的时候,匹配与之相同的一个字符。
示例1
io.open()
结果 = string.match("abcd","abc")
io.print( 结果 )
//显示abc

示例2
io.open()
结果 = string.match("abcd1234567890","123456789")
io.print( 结果 )
//显示123456789

2.1.2 特定的字符(使用“\转义符 + 特定字母字符”表示特定的字符类)

  • 常用 6个 (大写是取反的意思)
特定字符
匹     配
示     例
\d任意一个 数字,0~9任意一个数字”\d\d“模式匹配字符串”abc123时,匹配结果12
\w任意一个字母、数字、也就是A~Z,a~z,0~9 中任意一个(不匹配下划线,与正则区别)“\w”模式匹配字符串“aa100时,匹配结果a
\s空白符,包括空格、制表符、换行、换页符其中任意一个
空格(' ')、制表符 ('\t')、回车('\r')、换行('\n')、垂直定位字符('\v')或翻页('\f')
"\d\s"模式匹配字符串”aa 23 65“时,匹配结果3
\D\d取反,非数字"\D\D\D\D"模式匹配字符串"dadj1323DDa"时,匹配结果是dadj
\W\w取反,非字母、数字、下划线"\W\W"模式匹配字符串"dadj,!23DDa"时,匹配结果是,!
\S\s取反,非空白符"\S"模式匹配字符串'\ndadj,!23DDa'时,匹配结果是d(在快手字符串单引号’支持转义符)

  • 其他特殊字符
字符
匹配
字符
匹配
\a任意一个大小写字母,也即是A-Z,a-z\A\a 取反,任意一个非字母的字符,含数字、符号、空白符中一个
\l 任意一个小写字母,也即是a-z中的一个\L\l 取反,任意一个非小写字母的字符
\u任意一个大写字母,即A-Z中的一个\U\u 取反,任意一个非大写字母的字符
\p任意一个标点字符\P\p 取反,任意一个非标点字符的字符
\c 任意一个控制字符(与空白符??)\C\c 取反,任意一个非控制字符的字符
\n 任意一个换行符\N\n 取反,任意一个非换行符
\r回车符\R\r 取反,非回车符
\f换页符 'x0c'\F\f 取反,非换页符
\i是否ASCII字符( 字节码 < 0x80 ) \I\i 取反,不是ASCII字符( 字节码 >= 0x80 )
\x任意一个十六进制数字\X\x 取反,不是十六进制数字
\v一个垂直制表符。等价于 '\x0b' \V\v 取反,不是垂直制表符
\z\0 字节码为0的字符,对于普通文本表示文本结束\Z\z 取反,不是\0的字符

2.1.3任意字符
字符
匹配
示例
.圆点号,匹配任意一个单字节字符,包括换行符\n(与正则区别);
可放在尖括号<>内;
点号放在转义符\.或中括号[.]内则只匹配点号本身
"..."模式匹配字符串'\nkdja,.kl',匹配结果\nkd;
"\..."模式匹配字符串 '\nkdja,.kl',匹配结果.kl
:冒号任意一个双字节字符(中文字符),不适用于UNICODE编码字符;
可放在尖括号<>内,等同<\xA1-\xF7\xA1-\xFE>匹配中文;
冒号放在转义符\:或中括号[:]内则只匹配冒号本身
见示例3

示例3
io.open();//打开控制台
str = "快手真快速"

//{4}是修饰符,修饰前面表达式出现次数
io.print(string.match(str,".{4}") );//显示“快手”2个中文
io.print(string.match(str,":{4}") );//显示“快手真快”4个中文
io.print(string.match(str,":"));//显示快

2.1.4 自定义字符类 (用中括号[]表示)
[...] 在中括号内列出字面值字符、特殊字符,表示匹配中括号内字符任意一个,虽然可以是任意一个,但只能是匹配一个。

中括号支持由连字符“-”来表示一个范围。当“-”前后构成范围时,要求前面字符的码位小于后面字符的码位。

[^…] 排除型自定义字符类。表示任意一个未列出的字符,同样只能是匹配一个。

如:
字符匹配说明
[\d]匹配任意一个数字,等同于[0123456789]中任意一个数字
[\w_]匹配任意一个字母、数字、下划线
[0-9]匹配0123456789任意一个字符,等同于[\d]
[^\l\d_]匹配除小写字母、数字、下划线外任意一个字符

示例
io.open()
str = "abcd123465_AFDA"
io.print(string.match(str,
"[\a\d]"))//显示a
io.print(string.match(str,"[\w_]"))//显示a
io.print(string.match(str,"[0-9]"))//显示1
io.print(string.match(str,"[^\l\d_]"))//显示A
io.print("=====================")

//用string.gmatch函数遍历一个字符串内所有匹配模式的子串
for m in string.gmatch( str,"[\w_]") {
    io.print(m)
//显示abcd123465_AFDA
   
}


2.1.5 自定义字符串(用尖括号<>表示)串模式是模式匹配特有

  • <...>在尖括号内列示字面值字符,表示匹配一组有序的字符串而不是单个字符。
例如<hello>匹配hello单词。而不是hello其中的一个字符,类似模式"字面值"用法

  • 在串匹配的尖括号内部也可以使用特殊字符类,其语法类似使用[]自定义字符类的用法,但匹配一串而非一个。

例如:<\aA-Z> 匹配2个字符,匹配字母及大写字母A-Z中的一个,
io.open()
str = "abcd123465_AFDA"
io.print(string.match(str,"<\aA-Z>"))//显示AF


  • 也可以在串匹配中插入用中括号来定义的自定义字符类,用法与[]一样,只匹配一个
如下:<[a-z0-9]>  匹配串内 a-z小写字母、0-9数字其中一个。
io.open()
str = "abcd123465fAFDA"
io.print(string.match(str,
"<[a-z0-9]>"))//显示a


  • 反串配模式  在<^...>尖括号内开头^,表示匹配所有不是串内的字符,匹配由左边开始,匹配长度等长于串内字符长度,看示例
io.open();//打开控制台
str = "helloworld"
pattern = {
"<^hello>";"<^world>";"<^elloe>"}


for(i=1;#pattern;1){
   
for m in string.gmatch( str,pattern[ i ] ) {
        io.print(pattern[ i ]+
"匹配",m)
    }

}

显示
<^hello> 匹配ellow  (由左边开始匹配,不要hello单词,取串内等长字符,于是匹配ellow,后边orld只有4个长度不匹配)
<^world>匹配 hello(由左边开始匹配,hello符合不是world单词条件,后面是world所以不取)        
<^elloe>匹配 hello world(由左边开始,helllo不是elloe符合匹配条件,world也不是elloe也符合条件,字符长度都一样)


  • 串匹配注意事项
可在串匹配内使用'+'或'*'限定修饰符表示贪婪匹配,但是不能在尖括括号内部使用其他修饰符,不能使用问号来定义惰性匹配,也不能使用'|'或'&'等逻辑修饰符.

不能在尖括号内部使用圆括号来定义捕获组.

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
正则表达式中的分组构造 | Microsoft Learn
C# string 中的 @
Lua模式匹配
python-文本处理和正则表达式
最常用的PHP正则表达式收集整理
20分钟内看完这篇,闭着眼写正则表达式
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服