文字列を検索する - lisp-cookbook-ja/common-lisp GitHub Wiki
文字で検索する
文字列の中にその文字があるか調べるにはfind、最初にその文字が見つかった位置を調べるにはpositionを使います。
;; dが文字列の中に存在するときはdを返す
(find #\d "abcdef") ;=> #\d
;; 存在しなければnilを返す
(find #\g "abcdef") ;=> NIL
;; 最初にcが見つかった位置を返す
(position #\c "abcdef") ;=> 2
;; 見つからなければnilを返す
(position #\h "abcdef") ;=> NIL
文字列で検索する
;; 最初に"8"が見つかった位置を返す
(search "8" "1 3 2 3 8 6 4 7 1 5")
;=> 8
;; 見つからなければnilを返す
(search "0" "1 3 2 3 8 6 4 7 1 5")
;=> NIL
;; 文字列の最初から"1"を探す
(search "1" "1 3 2 3 8 6 4 7 1 5")
;=> 0
;; 文字列の最後から"1"を探す
(search "1" "1 3 2 3 8 6 4 7 1 5" :from-end t)
;=> 16
;; 4文字目から最後の文字までの範囲で"3"を探す
(search "3" "1 3 2 3 8 6 4 7 1 5" :start2 3)
;=> 6
;; 2文字目から5文字目までの範囲で"1"を探す
(search "1" "1 3 2 3 8 6 4 7 1 5" :start2 1 :end2 4)
;=> NIL
正規表現で検索する
正規表現はどちらかというと、文字列の中から複雑な条件に一致する部分を見つけるために使われますが、単純に特定の文字列を探すためにも使えます。
CLiki:CL-PPCREを使うと、
(ppcre:scan "はちべえ" "すけさんかくさんはちべえやしち")
;=> 8 ; パターンに一致する部分の開始位置
; 12 ; パターンに一致する部分の終了位置+1
; #() ; グループ化されたパターンに一致する部分の開始位置の配列
; #() ; グループ化されたパターンに一致する部分の終了位置+1の配列
こんな風に文字列を探せます。