SRE


http://www.scsh.net/docu/post/sre.html

http://www.scsh.net/docu/html/man-Z-H-7.html

S-expression Regular Expression。正規表現のS式表記。

例えば、日付にマッチする正規表現を次のようにかくことができる。

(define date-sre (rx (seq (or "Jan" "Feb" "Mar" "Apr" "May" "Jun"
                              "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
                          (+ whitespace)
                          (or ("123456789")
                              (seq ("12") digit)
                              "30"
                              "31"))))

構文

Gauche の正規表現との対応関係は以下の通り。

SRE Gauche
(* re ...) (?:re...)*
該当なし re*?
該当なし re*+
(+ re ...) (?:re...)+
該当なし re+?
該当なし re++
(? re ...) (?:re...)?
該当なし re??
該当なし re?+
(= n re ...) (?:re...){n}
(>= n re ...) (?:re...){n,}
該当なし re{n,}?
(** n m re ...) (?:re...){n,m}
該当なし re{n,m}?
(submatch re ...) (re...)
(uncase re ...) (?i:re...)
該当なし (?-i:re...)
(| pat1 pat2 ...), (or pat1 pat2 ...) pat1|pat2|...
(: pat1 pat2 ...), (seq pat1 pat2 ...) pat1pat2...
("abcd") [abcd]
(/"az" "AZ"), (/"azAZ"), (/ #\a #\z "AZ"), etc. [a-zA-Z]
any .
bos ^
eos $
bol 行頭。該当なし(理由はGauche:regexp)
eol 行末。該当なし
bow 語の先頭。\b
eol 語の末尾。\b
該当なし \B
alphabetic [[:alpha:]]
alphanumeric [[:alnum:]]
ascii [\x00-\x0f]
blank [[:blank:]]
control [[:cntrl:]]
graphic [[:graph:]]
hex-digit [[:xdigit:]]
lower-case [[:lower:]]
nonl [^\n]
numeric \d
printing [[:print:]]
punctuation [[:punct:]]
upper-case [[:upper:]]
whitespace \s
word \w
(~ numeric) \D
(~ whitespace) \S
(~ word) \W
該当なし (?=re)
該当なし (?!re)
該当なし (?<=re)
該当なし (?<!re)
該当なし (?>re)
該当なし (?<name>re)
該当なし \n
該当なし \k<name>

またさらに、文字クラス同士の集合演算をおこなうこともできる。

(| <cset> ...)

文字クラスの和集合。ただし (|) = #[]

(- <cset> ...)

文字クラスの差集合

(& <cset> ...)

文字クラスの積集合

(~ <cset> ...)

<cset> ... の和集合の補集合。(~ <cset> ...) = (~ (| <cset> ...))。 また、(~) = (~ (|)) = any

このとき、文字、長さ 1 の文字列もそれぞれ文字集合としてあつかわれる。

lexical case sensivity context

SRE 中の文字、文字列、文字集合は lexical case sensivity context にしたがって解釈される。lexical case sensivity context は w/case と w/nocase で切り替える(トップレベルの context は case sensitive)。

たとえば、

(w/nocase "abc"
          (* "FOO" (w/case "Bar"))
          ("aeiou"))

のような SRE は /[aA][bB][cC](?:[Ff][Oo][Oo]Bar)*[aeiouAEIOU]/ と同等の正規表現と解釈される。

lexical case sensivity context が影響をあたえるのは文字列 "foo"、 文字 #\a、文字集合 ("abc")、範囲指定による文字集合 (/"az") のみで、文字クラスの名前指定には影響しない。たとえば (w/nocase lower) は alpha と同等にはならない。また、後述の埋め込み SRE にも影響を与えない。

さらに、w/nocase と uncase は同等でないことにも注意。

(uncase (~ "a"))
(w/nocase (~ "a"))

のようなふたつの SRE を比較すると、 uncase の方では、まず (~ "a") が [^a] と解釈される。これは A に マッチするので (uncase (~ "a")) は a にもマッチする。したがって、 (uncase (~ "a")) は結局すべての文字にマッチすることになる。

これに対して w/nocase の場合では、まず "a" が [aA] と解釈され、 (w/nocase (~ "a")) 全体は [^aA] と同等のものとして解釈される。

SRE の埋め込み

,<exp> のようにすると、SRE のなかに文字や文字列、文字集合、 正規表現をうめこむことができる。

例:

(rx (+ ,(if (zero? n) "white" "red")))

, をつかって埋め込んだ場合、展開された SRE にふくまれていたサブマッチ情報はすべてとりのぞかれる。

サブマッチ情報をのこしたまま埋め込みたい場合には ,@ をつかう。

例:

(define p (rx (submatch "b" (submatch "a"))))   ; === (b(a))
(rx (submatch "c" ,p))  ; === (cba)
(rx (submatch "c" ,@p)) ; === (c(b(a)))

参考

Tags: 正規表現, SRE


Last modified : 2013/04/21 04:35:41 UTC