资源描述:
《在lisp中应用正则表达式》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、在lisp中应用正则表达式[序] 长久以来,文本的编辑一直是lisp编程的重点、难点之一,有不少活跃在xdcad和明经通道论坛的高手为此写了不少有代表性的文字处理工具,比较知名的如: 。而我自己也写过不少这方面的程序,多数没有发表,少数零星地发布在以上两个论坛。但由于lisp对文本编辑(*注)的支持函数不够丰富,而实际工作中遇到的情况又多种多样,使得诸多lisp程序对文本编辑的深度和灵活性上还有很多不足之处,不免遗憾。为此,我一直以来寻求更好的方法,最终只有一个答案:正则表达式。正则表达式对文本编辑很强,有多强?看看vb或vbs参考就知道,也可上网一搜。但是,也许本人孤陋寡闻(或
2、是有的高手潜水潜得很深),在网上一直没有见过在lisp中比较充分地应用正则表达式的程序。其实,我很早就想将正则表达式移植到lisp里面来,近几日一鼓作气,终有小成。谨奉献两个函数:(xxexp)(xxexpr),这两个函数提供了正则表达式的接口,使在lisp中得以应用其强大的功能成为可能。 ―――――梁雄啸.2007.7 *注:“文本”在本文均指对文本字符串内容,非指文本实体(0.“*TEXT”)函数下载地址: http://ys-c.ys168.com/?屠文双刀.rar_67el0c7bs5bt2bsp0crn
3、1btrml0c2bk5btmn0cmqju14z97f14z[函数介绍]函数:(xxexppatstrkey)功能对字符串进行正则表达式匹配测试.参数:pat=正则表达式模式,对应vbs正则表达式的模式(expression)。说明:号要用 \替代. str=字符串 key="i""g""m","i"不区分大小写(Ignorecase),"g"全局匹配(Global).”m”多行模式(Multiline),以上几个关键字可以组合使用,或用””.返回:返回匹配的字符列表,或无一匹配返回nil函数:(xxexprpatstrnstrkey)功能对字符串进行正则表达式替
4、换.参数:pat=正则表达式模式,对应vbs正则表达式的模式(expression)。说明:号要用 \替代. str=被替换字符串 nstr=替换字符串 key="i""g""m","i"不区分大小写(Ignorecase),"g"全局匹配(Global).”m”多行模式(Multiline),以上几个关键字可以组合使用,或用””.返回:返回替换后的字符串.[正则表达式模式]正则表达式核心就是其模式(expression),此部分资料可从网上或vb,vbs参考中得到。以下是vbs参考中关于模式的描述列表。在xxexp,xxexpr函数应用中,注意””符要按”
5、\”来写。 字符描述将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,'n'匹配字符"n"。''匹配一个换行符。序列'\'匹配""而"("则匹配"("。^匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配''或'r'之后的位置。$匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配''或'r'之前的位置。*匹配前面的子表达式零次或多次。例如,zo*能匹配"z"以及"zoo"。*等价于{0,}。+匹配前面的子表达式一次或多次。例如,'zo+'能匹配"
6、zo"以及"zoo",但不能匹配"z"。+等价于{1,}。?匹配前面的子表达式零次或一次。例如,"do(es)?"可以匹配"do"或"does"中的"do"。?等价于{0,1}。{n}n是一个非负整数。匹配确定的n次。例如,'o{2}'不能匹配"Bob"中的'o',但是能匹配"food"中的两个o。{n,}n是一个非负整数。至少匹配n次。例如,'o{2,}'不能匹配"Bob"中的'o',但能匹配"foooood"中的所有o。'o{1,}'等价于'o+'。'o{0,}'则等价于'o*'。{n,m}m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,"o{1,3}"将匹
7、配"fooooood"中的前三个o。'o{0,1}'等价于'o?'。请注意在逗号和两个数之间不能有空格。?当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串"oooo",'o+?'将匹配单个"o",而'o+'将匹配所有'o'。.匹配除""之外的任何单个字符。要匹配包括''在内的任何字符,请使用象'[.