使用Common Lisp进行正则表达式匹配

Table of Contents

cl-ppcre是一个Common Lisp的可移植的正则表达式软件库,它与Perl语言兼容,它速度很快,它在符合ANSI标准的Common Lisp实现中是可移植的,它带有 BSD 风格的许可证,因此您基本上可以随心所欲地使用它。本文介绍cl-ppcre库中常用的正则表达式函数。

1. scan

语法 scan regex target-string &key start end => match-start, match-end, reg-starts, reg-ends
函数scan从开始(默认为 0)到结束(默认为 target-string 的长度)搜索目标字符串target-string,并尝试匹配正则表达式。
函数返回的第3、4个值为正则表达式中每个register(即元字符括号组件)匹配的begin indexes和end indexed组成的数组。

CL-USER>(cl-ppcre:scan "(a)*b" "xaaabd")
1
5
#(3)
#(4)

CL-USER>(cl-ppcre:scan '(:GREEDY-REPETITION 0 NIL #\b) "bbbc")
0
3
#()
#()

CL-USER>(cl-ppcre:scan-to-strings "(a)*b" "xaaabd")
"aaab"
#("a")

函数scan-to-strings 与 scan对应,返回匹配的字符串和相应于每个register的匹配字符串组成的数组

2. split

语法: split regex target-string &key start end limit with-registers-p omit-unmatched-p sharedp => list
函数split尽可能多地将正则表达式与目标字符串进行匹配,并返回匹配项之间的子字符串列表。

CL-USER>(cl-ppcre:split "\\s+" "foo   bar baz frob")
("foo" "bar" "baz" "frob")

3. regex-replace,regex-replace-all

语法: regex-replace regex target-string replacement &key start end preserve-case simple-calls element-type => string, matchp
函数regex-replace尝试将 start 和 end 之间的 target-string 与正则表达式进行匹配,并将第一个匹配项替换为 replacement。函数regex-replace-all将所有匹配项替换。

CL-USER>(cl-ppcre:regex-replace "fo+" "foo bar" "frob")
"frob bar"
T

CL-USER>(cl-ppcre:regex-replace-all "(?i)fo+" "foo Fooo FOOOO bar" "frob" :preserve-case t)
"frob Frob FROB bar"
T

Author: LispSu