使用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