cl ppcre - lisp-cookbook-ja/common-lisp GitHub Wiki

ๆญฃ่ฆ่กจ็พ cl-ppcre

CLiki:CL-PPCREใงใฏๆญฃ่ฆ่กจ็พใ‚’ๆ–‡ๅญ—ๅˆ—ใ‹Sๅผใง่กจ็พใ—ใพใ™ใ€‚ๆ–‡ๅญ—ๅˆ—ใงๆญฃ่ฆ่กจ็พใ‚’่กจ็พใ™ใ‚‹ๅ ดๅˆใฏใ€ๆ–‡ๅญ—ใ‚ฏใƒฉใ‚นใ‚’ไฝฟใ†ใจใใชใฉใ€Perlใชใฉใงไฝฟใ‚ใ‚Œใ‚‹่กจ่จ˜ใ‚’ใ‚จใ‚นใ‚ฑใƒผใƒ—ใ—ใชใ‘ใ‚Œใฐใชใ‚‰ใชใ„ใ“ใจใŒใ‚ใ‚Šใพใ™ใ€‚

ๅฐŽๅ…ฅ

Quicklispใ‹ใ‚‰ๅ…ฅใ‚Œใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚

(ql:quickload :cl-ppcre)

ใƒ‘ใ‚ฟใƒผใƒณใฎไพ‹

ๅŸบๆœฌ็š„ใซPerlใฎๆญฃ่ฆ่กจ็พใ‚’ๆ–‡ๅญ—ๅˆ—ใงๆธกใ›ใฐๅ•้กŒใ‚ใ‚Šใพใ›ใ‚“ใ€‚ใŸใ ใ—ใ€ไธŠใซใ‚‚ใ‚ใ‚Šใพใ™ใŒใ€ๆ–‡ๅญ—ๅˆ—ใงๆญฃ่ฆ่กจ็พใ‚’่กจใ™ๅ ดๅˆใ€่กจ่จ˜ใ‚’ใ‚จใ‚นใ‚ฑใƒผใƒ—ใ—ใชใ‘ใ‚Œใฐใชใ‚‰ใชใ„ใ“ใจใŒใ‚ใ‚Šใพใ™ใ€‚

;; bใซใƒžใƒƒใƒใ™ใ‚‹
(ppcre:scan "b" "abc")
(ppcre:scan #\b "abc")
;=> 1
;   2
;   #()
;   #()

;; ไปปๆ„ใฎๆ–‡ๅญ—ใซใƒžใƒƒใƒใ™ใ‚‹
(ppcre:scan "." "abc")
(ppcre:scan :everything "abc")
;=> 0
;   1
;   #()
;   #()

;; ไปปๆ„ใฎ3ๆ–‡ๅญ—ใซใƒžใƒƒใƒใ™ใ‚‹
(ppcre:scan "..." "abc")
(ppcre:scan '(:sequence :everything :everything :everything) "abc")
;=> 0
;   3
;   #()
;   #()

;; Perlใฎๆ–‡ๅญ—ใ‚ฏใƒฉใ‚น\wใซใƒžใƒƒใƒใ™ใ‚‹
;; "\w"ใฏ"w"ใจๅŒใ˜ๆ„ๅ‘ณใซใชใฃใฆใ—ใพใ†ใŸใ‚ใ€"\\w"ใจใ—ใชใ‘ใ‚Œใฐใชใ‚‰ใชใ„
(ppcre:scan "\\w" "abc")
(ppcre:scan :word-char-class "abc")
;=> 0
;   1
;   #()
;   #()

;; aใจbใจcใฎใ„ใšใ‚Œใ‹ใซใƒžใƒƒใƒใ™ใ‚‹
(ppcre:scan "[abc]" "a")
(ppcre:scan '(:char-class #\a #\b #\c) "a")
;=> 0
;   1
;   #()
;   #()
(ppcre:scan "[abc]" "c")
(ppcre:scan '(:char-class #\a #\b #\c) "c")
;=> 0
;   1
;   #()
;   #()

;; aใจbใจcไปฅๅค–ใซใƒžใƒƒใƒใ™ใ‚‹
(ppcre:scan "[^abc]" "c")
(ppcre:scan '(:inverted-char-class #\a #\b #\c) "c")
;=> NIL
(ppcre:scan "[^abc]" "d")
(ppcre:scan '(:inverted-char-class #\a #\b #\c) "d")
;=> 0
;   1
;   #()
;   #()

;; ่กŒใฎๆœ€ๅˆใฎaใซใƒžใƒƒใƒใ™ใ‚‹
(ppcre:scan "^a" "abc")
(ppcre:scan '(:sequence :start-anchor #\a) "abc")
;=> 0
;   1
;   #()
;   #()
(ppcre:scan "^a" "cba")
(ppcre:scan '(:sequence :start-anchor #\a) "cba")
;=> NIL

;; ่กŒใฎๆœ€ๅพŒใฎcใซใƒžใƒƒใƒใ™ใ‚‹
(ppcre:scan "c$" "abc")
(ppcre:scan '(:sequence #\c :end-anchor) "abc")
;=> 2
;   3
;   #()
;   #()
(ppcre:scan "c$" "aaa")
(ppcre:scan '(:sequence #\c :end-anchor) "aaa")
;=> NIL

;; 0ๆ–‡ๅญ—ไปฅไธŠใฎๆ•ฐๅญ—ใซใƒžใƒƒใƒใ™ใ‚‹
(ppcre:scan "\\d*" "01234")
(ppcre:scan '(:greedy-repetition 0 nil :digit-class) "01234")
;=> 0
;   5
;   #()
;   #()

;; 1ๆ–‡ๅญ—ไปฅไธŠใฎๆ•ฐๅญ—ใซใƒžใƒƒใƒใ™ใ‚‹
(ppcre:scan "\\d+" "01234")
(ppcre:scan '(:greedy-repetition 1 nil :digit-class) "01234")
;=> 0
;   5
;   #()
;   #()
(ppcre:scan "\\d+" "abc012")
(ppcre:scan '(:greedy-repetition 1 nil :digit-class) "abc012")
;=> 3
;   6
;   #()
;   #()

ใƒกใ‚ฟๆ–‡ๅญ—่‡ชไฝ“ใธใฎใƒžใƒƒใƒ

ๆ–‡ๅญ—ๅˆ—ใง่กจใ—ใŸๆญฃ่ฆ่กจ็พใงใƒกใ‚ฟๆ–‡ๅญ—่‡ชไฝ“ใธใƒžใƒƒใƒใ•ใ›ใŸใ„ๅ ดๅˆใ€ใƒกใ‚ฟๆ–‡ๅญ—ใ‚’ใ‚จใ‚นใ‚ฑใƒผใƒ—ใ—ใฆใƒ‘ใ‚ฟใƒผใƒณใซๆŒ‡ๅฎšใ—ใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“ใ€‚

;; ใ€Œ^ใ€ใซใƒžใƒƒใƒใ™ใ‚‹
(ppcre:scan "\\^" "^")
(ppcre:scan #\^ "^")
;=> 0
;   1
;   #()
;   #()

;; ใ€Œ^ใ€ใงใ‚ใ‚ŠใŒใกใชใƒŸใ‚น๏ผˆ่กŒใฎๅ…ˆ้ ญใซใƒžใƒƒใƒ๏ผ‰
(ppcre:scan "^" "^")
;=> 0
;   0
;   #()
;   #()

;; ๅฟœ็”จไพ‹๏ผšๆŒ‡ๆ•ฐใ‚’ๅ–ใ‚Šๅ‡บใ™
(ppcre:register-groups-bind (e)
    ("\\^([0-9]+)=" "2^10=1024")
  e)
(ppcre:register-groups-bind (e)
    ('(:sequence
       #\^
       (:register (:greedy-repetition 1 nil (:char-class (:range #\0 #\9))))
       #\=)
      "2^10=1024")
  e)
;=> "10"

;; ใ€Œ(ใ€ใ‚„ใ€Œ)ใ€ใซใƒžใƒƒใƒใ™ใ‚‹
(ppcre:scan "\\(" "(")
(ppcre:scan #\( "(")
(ppcre:scan "\\)" ")")
(ppcre:scan #\) ")")
;=> 0
;   1
;   #()
;   #()

;; ใ€Œ(ใ€ใ‚„ใ€Œ)ใ€ใงใ‚ใ‚ŠใŒใกใชใƒŸใ‚น๏ผˆๆญฃ่ฆ่กจ็พใฎๆง‹ๆ–‡ใ‚จใƒฉใƒผ๏ผ‰
(ppcre:scan "(" "(")
(ppcre:scan ")" ")")
;>> Error: Expected end of string.

;; ๅฟœ็”จไพ‹๏ผšๆ‹ฌๅผงๅ†…ใฎๆ–‡ๅญ—ใ‚’ๅ–ใ‚Šๅ‡บใ™
(ppcre:register-groups-bind (n)
    ("\\(([0-9]+)\\)$" "math(85)")
  n)
(ppcre:register-groups-bind (n)
    ('(:sequence
       #\(
       (:register (:greedy-repetition 1 nil (:char-class (:range #\0 #\9))))
       #\)
       :end-anchor)
      "math(85)")
  n)
;=> "85"

ใƒ‘ใ‚ฟใƒผใƒณใƒžใƒƒใƒ

;; ใƒžใƒƒใƒใ—ใŸไฝ็ฝฎใ‚’่ฟ”ใ™
(ppcre:scan "[c-e]+" "abcdefg")
;=> 2
;   5
;   #()
;   #()

;; ไธ‰็•ช็›ฎใจๅ››็•ช็›ฎใฎๆˆปใ‚Šๅ€คใฏใ‚ฐใƒซใƒผใƒ—ๅŒ–ใ•ใ‚ŒใŸใƒ‘ใ‚ฟใƒผใƒณใŒใƒžใƒƒใƒใ—ใŸไฝ็ฝฎ
(ppcre:scan "((a)(b)(c))" "abc")
;=> 0
;   3
;   #(0 0 1 2)
;   #(3 1 2 3)

;; ใƒžใƒƒใƒใ™ใ‚‹้ƒจๅˆ†ใŒใชใ„ใจใใฏNILใŒ่ฟ”ใ‚‹
(ppcre:scan "a" "b")
;=> NIL

;; ใƒžใƒƒใƒใ—ใŸ้ƒจๅˆ†ๆ–‡ๅญ—ๅˆ—ใ‚’่ฟ”ใ™
(ppcre:scan-to-strings "\\d+" "Originally specified in 1958, Lisp is")
;=> "1958"
;   #()

;; ใƒ‘ใ‚ฟใƒผใƒณใซใƒžใƒƒใƒใ™ใ‚‹ๅ…จใฆใฎ้ƒจๅˆ†ๆ–‡ๅญ—ๅˆ—ใ‚’ใƒชใ‚นใƒˆใง่ฟ”ใ™
(ppcre:all-matches-as-strings "\\w+" "foo bar baz")
;=> ("foo" "bar" "baz")

ๅค‰ๆ•ฐใธใฎๆŸ็ธ›

ใƒ‘ใ‚ฟใƒผใƒณใซใƒžใƒƒใƒใ—ใŸๆ–‡ๅญ—ๅˆ—ใ‚’ๅค‰ๆ•ฐใซๆŸ็ธ›ใ—ใพใ™ใ€‚

;; ใ‚ฐใƒซใƒผใƒ—ๅŒ–ใ•ใ‚ŒใŸใƒ‘ใ‚ฟใƒผใƒณใŒใƒžใƒƒใƒใ—ใŸ้ƒจๅˆ†ใฎๆ–‡ๅญ—ๅˆ—ใ‚’้ †็•ชใซๆŸ็ธ›ใ™ใ‚‹
(ppcre:register-groups-bind (base _ exp)
    ("(\\d+)(\\^(\\d+))?" "10^1000")
  (declare (ignore _))
  (values (read-from-string base)
          (read-from-string exp)))
;=> 10
;   1000

;; ใ‚ฐใƒซใƒผใƒ—ๅŒ–ใ•ใ‚ŒใŸใƒ‘ใ‚ฟใƒผใƒณใŒใชใ„ใจใ‚จใƒฉใƒผ
(ppcre:register-groups-bind (match)
    ("a" "abc")
  match)
;>> Error: Array index 0 out of bounds for #() .

็นฐใ‚Š่ฟ”ใ—

ใƒ‘ใ‚ฟใƒผใƒณใซใƒžใƒƒใƒใ™ใ‚‹้ƒจๅˆ†ใŒ่ฆ‹ไป˜ใ‹ใ‚‹ใ”ใจใซๅ‡ฆ็†ใ‚’็นฐใ‚Š่ฟ”ใ—ใพใ™ใ€‚

;; ใƒžใƒƒใƒใ—ใŸ้ƒจๅˆ†ใฎไฝ็ฝฎใŒๆธกใ•ใ‚Œใ‚‹
(let ((target "1 20 300 4000 50000"))
  (ppcre:do-matches (start end "\\d+" target)
    (format t "~A~%" (subseq target start end))))
;-> 1
;   20
;   300
;   4000
;   50000
;=> NIL

;; ใƒžใƒƒใƒใ—ใŸ้ƒจๅˆ†ใฎๆ–‡ๅญ—ๅˆ—ใŒๆธกใ•ใ‚Œใ‚‹
(ppcre:do-matches-as-strings (match "\\d+" "1 20 300 4000 50000")
  (format t "~A~%" match))
;-> 1
;   20
;   300
;   4000
;   50000
;=> NIL

ใƒ‘ใ‚ฟใƒผใƒณใฎ็ฝฎๆ›

;; ็ฝฎๆ›ๅพŒใฎๆ–‡ๅญ—ๅˆ—ใจใƒžใƒƒใƒใ—ใŸใ‹ใฉใ†ใ‹ใ‚’่ฟ”ใ™
(ppcre:regex-replace "<" "<<<" "&lt;")
;=> "&lt;<<"
;   T

;; ใƒžใƒƒใƒใ—ใชใ‘ใ‚ŒใฐไบŒ็•ช็›ฎใฎๆˆปใ‚Šๅ€คใฏNIL
(ppcre:regex-replace ">" "<<<" "&lt;")
;=> "<<<"
;   NIL

;; ใƒžใƒƒใƒใ™ใ‚‹ใƒ‘ใ‚ฟใƒผใƒณใ™ในใฆใ‚’็ฝฎใๆ›ใˆใ‚‹
(ppcre:regex-replace-all "<" "<<<" "&lt;")
;=> "&lt;&lt;&lt;"
;   T

;; ๅฟœ็”จไพ‹๏ผšๆ”น่กŒใ‚’็ฉบ็™ฝใซ็ฝฎๆ›ใ™ใ‚‹
(ppcre:regex-replace-all "\\n" "a
b
c" " ")
(ppcre:regex-replace-all #\newline "a
b
c" " ")
;=> "a b c"
;   T

ใƒ‘ใ‚ฟใƒผใƒณใซใ‚ˆใ‚‹ๅˆ†ๅ‰ฒ

;; ๅˆ†ๅ‰ฒใ—ใฆใƒชใ‚นใƒˆใง่ฟ”ใ™
(ppcre:split "," "a,b,c")
;=> ("a" "b" "c")

;; ใƒžใƒƒใƒใ—ใŸใƒ‘ใ‚ฟใƒผใƒณใŒๆ–‡ๅญ—ๅˆ—ใฎๆœ€ๅพŒใซใ‚ใ‚‹ใจใใฏ็„ก่ฆ–ใ•ใ‚Œใ‚‹
(ppcre:split "," "a,b,c,")
;=> ("a" "b" "c")

;; ใƒžใƒƒใƒใ—ใชใ„ใจใใฏใใฎใพใพใฎๆ–‡ๅญ—ๅˆ—ใ‚’ใƒชใ‚นใƒˆใซใ—ใฆ่ฟ”ใ™
(ppcre:split "," "abc")
;=> ("abc")

ๅ‚่€ƒๆ–‡็Œฎ

โš ๏ธ **GitHub.com Fallback** โš ๏ธ