CL-PPCRE - библиотека для работы с регулярными выражениями в CL

Разбить строку по регулярному выражению

(split "\\s+" "foo   bar baz
frob")
; ("foo" "bar" "baz" "frob")

(split "\\s*" "foo bar   baz")
; ("f" "o" "o" "b" "a" "r" "b" "a" "z")

(split "(\\s+)" "foo bar   baz")
; ("foo" "bar" "baz")

(split "(\\s+)" "foo bar   baz" :with-registers-p t)
; ("foo" " " "bar" "   " "baz")

(split "(\\s)(\\s*)" "foo bar   baz" :with-registers-p t)
; ("foo" " " "" "bar" " " "  " "baz")

(split "(,)|(;)" "foo,bar;baz" :with-registers-p t)
; ("foo" "," NIL "bar" NIL ";" "baz")

(split "(,)|(;)" "foo,bar;baz" :with-registers-p t :omit-unmatched-p t)
; ("foo" "," "bar" ";" "baz")

(split ":" "a:b:c:d:e:f:g::")
; ("a" "b" "c" "d" "e" "f" "g")

(split ":" "a:b:c:d:e:f:g::" :limit 1)
; ("a:b:c:d:e:f:g::")

(split ":" "a:b:c:d:e:f:g::" :limit 2)
; ("a" "b:c:d:e:f:g::")

(split ":" "a:b:c:d:e:f:g::" :limit 3)
; ("a" "b" "c:d:e:f:g::")

(split ":" "a:b:c:d:e:f:g::" :limit 1000)
; ("a" "b" "c" "d" "e" "f" "g" "" "")

Замена по регулярному выражению

(regex-replace "fo+" "foo bar" "frob")
; "frob bar"
; T

(regex-replace "fo+" "FOO bar" "frob")
; "FOO bar"
; NIL

(regex-replace "(?i)fo+" "FOO bar" "frob")
; "frob bar"
; T

(regex-replace "(?i)fo+" "FOO bar" "frob" :preserve-case t)
; "FROB bar"
; T

(regex-replace "(?i)fo+" "Foo bar" "frob" :preserve-case t)
; "Frob bar"
; T

(regex-replace "bar" "foo bar baz" "[frob (was '\\&' between '\\`' and '\\'')]")
; "foo [frob (was 'bar' between 'foo ' and ' baz')] baz"
; T

(regex-replace "bar" "foo bar baz"
               '("[frob (was '" :match "' between '" 
                                :before-match "' and '" :after-match "')]"))
; "foo [frob (was 'bar' between 'foo ' and ' baz')] baz"
; T

(regex-replace "(be)(nev)(o)(lent)"
                          "benevolent: adj. generous, kind"
                          #'(lambda (match &rest registers)
                              (format nil "~A [~{~A~^.~}]" match registers))
                          :simple-calls t)
; "benevolent [be.nev.o.lent]: adj. generous, kind"
; T

Замена всех вхождений по регулярному выражению

(regex-replace-all "(?i)fo+" "foo Fooo FOOOO bar" "frob" :preserve-case t)
; "frob Frob FROB bar"
; T

(regex-replace-all "(?i)f(o+)" "foo Fooo FOOOO bar" "fr\\1b" :preserve-case t)
; "froob Frooob FROOOOB bar"
; T

Получить строку по регулярному выражению

(scan-to-strings "[^b]*b" "aaabd")
; "aaab"
; #()

(scan-to-strings "([^b])*b" "aaabd")
; "aaab"
; #("a")

(scan-to-strings "(([^b])*)b" "aaabd")
; "aaab"
; #("aaa" "a")
-----------
-----------