Aardio 模式匹配与正则的一些区别总结

admin2021-10-08  2.6K+

 模式匹配与aardio语言完全融为一体,很多标准库的函数默认就支持模式匹配语法。模式表达式基本的语法参考了正则表达式的语法,但比正则表达式更简单、运行速度也更快。 实际上在aardio的设计中一直在尽可能的运用大家现有的、传统的知识和书写习惯,以降低学习成本。当我们在不同语言、不同技术间切换时,很多不必要的差异会导致不必要的混乱、不必要的记忆成本。aardio在设计的每一个细节上都努力避免这一点。当然,我们仍然要注意正则表达式与模式匹配的一些区别,例如:

import win
//单引号\符是需要转义,双引号不需要,建议表达式用双引号或或反引号(`)
//正则表达式中双引号和单引号是一样的
 
var $mat = string.match("abc123","\d ")
win.msgbox($mat)
$mat = string.match("abc123",'\\d ')
win.msgbox($mat)
 
//模式匹配\a代表字母(不区分大小写),正则中的\a 代表 "警钟", 即 BEL 字符 (Chr(7)). 
$mat = string.match("abc123","\a ")
win.msgbox($mat)
$mat = string.match("ABC123","\a ")
win.msgbox($mat)
 
//正则表达式中\u表示unicode编码,而模式匹配中\u表示大写字符,\l表示小写字符 。
$mat = string.match("abcDEF","\u ")
win.msgbox($mat)
$mat = string.match("ABCedf","\l ")
win.msgbox($mat)
 
 
//模式匹配%表示成对出现的符号及包含的字符串,正则表达式没有类似的语法。
$mat = string.match("a = (a(b)cd) ","%()")
win.msgbox($mat)
$mat = string.match("a = (a(b)cd) ","%()?") //加?以表示惰性匹配(最短匹配),
win.msgbox($mat)
 
//冒号':'表示任意多字节字符(中文字符) 
$mat = string.match("你好 World!",": ")
win.msgbox($mat)
 
//字符串匹配<>,正则表达式没有这个,<>内可以使用".",":"和修饰符,
//例如:"<: >" 表示任意多字节字符 ,不能在尖括号内部使用圆括号来定义捕获组.
 
$mat = string.match("abcDEF","<abc>") //匹配abc字符串
win.msgbox($mat)
$mat = string.match("abcDEF","[abc]") //匹配abc其中一个字符
win.msgbox($mat)
 
 
//逻辑与匹配&,逻辑与匹配返回其中最长匹配结果.正则表达式没有这个用法
//参与与匹配的模式元中包含串,返回结果将按最长的串返回匹配结果.
//类似修饰符,表示前面和后后都是数字<\d>&<\d>
$mat = string.match( "1A2B3C。","(. ?)<\d>&<\d>") //取消?返回1A2B
win.msgbox($mat)
 
/*
模式匹配在串匹配可以使用'@'字符全局禁用、或局部串禁用模式语法,
或指定局部串忽略大小写,正则表达式无此功能,这个功能尤其是匹配大段的的文本时尤其有用。
*/
$mat = string.match( "1A\d\a3C。","@\d") //前面加@全局禁用
win.msgbox($mat)
$mat = string.match( "1f\D\a3C。","\d\a<@\D\a@>") //前面加<@ @>局部禁用,不忽略大小写
win.msgbox($mat)
$mat = string.match( "1f\D\a3C。","\d\a<@@\d\a@>") //前面加<@@ @>局部禁用,忽略大小写
win.msgbox($mat)
 
 
/*
模式匹配提供边界断言功能可以实现简单的自定义零宽断言以及边界测试,
正则正则表达式使用\b表示单词边界,
另外正则表达式提供更强大的自定义零宽断言(Lookaround)。
*/
 
import console; 
 
//测试字符串
var str = "abc 3ddeadsfasd dfa123 qerqwe"
 
import preg; 
 
//正则表达式向后、向前零宽断言
var regex = preg("(?<!\w)(?=\w)([a-zA-Z]\w*)");  
for word in regex.gmatch( str  ) { 
    console.log("正则表达式:", word )
}
regex.free();
 
//模式匹配边界断言
for word in string.gmatch( str,"!\w([a-zA-Z]\w*)") { 
    console.log("模式匹配:", word )
}
 
console.pause();


————————————————
版权声明:本文为CSDN博主「风行者_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_60842374/article/details/120136907

转载请注明原文地址: http://aardio.net/read-222.html
最新回复(0)
aardio问答
aardio编程语言