Re2 OCaml bindings for RE2, Google's regular expression library
があった。
使い方をメモしておく。
インストール
opamでインストールできる。$ opam install re2
例
以下はutopでの確認。utop[11]> #require "re2";; (* create関数の定義を確認 *) utop[16]> Re2.Regex.create;; - : ?options:Re2.Regex.Options.t list -> bytes -> Re2.Regex.t Or_error.t = <fun> (* 正規表現を作る *) utop[18]> let re = Re2.Regex.create_exn "aaa(.*)bbb";; val re : Re2.Regex.t = <abstr> (* 正規表現のパターンを取得する *) utop[19]> Re2.Regex.pattern re;; - : bytes = "aaa(.*)bbb" (* マッチさせる *) utop[20]> Re2.Regex.find_all re "aaaほげbbbaaaふがbbb";; - : bytes list Or_error.t = Core_kernel.Result.Ok ["aaaほげbbbaaaふがbbb"] (* .*部分を最長一致さたいので正規表現を作り直し *) utop[21]> let re = Re2.Regex.create_exn "aaa(.*?)bbb";; val re : Re2.Regex.t = <abstr> (* 再度マッチさせる *) utop[22]> Re2.Regex.find_all re "aaaほげbbbaaaふがbbb";; - : bytes list Or_error.t = Core_kernel.Result.Ok ["aaaほげbbb"; "aaaふがbbb"] (* サブマッチを取り出す *) utop[23]> Re2.Regex.find_all re ~sub:(`Index 1) "aaaほげbbbaaaふがbbb";; - : bytes list Or_error.t = Core_kernel.Result.Ok ["ほげ"; "ふが"] (* マッチした文字列を置換する *) utop[26]> Re2.Regex.rewrite re ~template:"<replaced>" "aaaほげbbbcccふがddd";; - : bytes Or_error.t = Core_kernel.Result.Ok "<replaced>cccふがddd" (* サブマッチを取り出す(その2) *) utop[27]> Re2.Regex.find_submatches re "aaaほげbbbaaaふがbbb";; - : bytes option array Or_error.t = Core_kernel.Result.Ok [|Some "aaaほげbbb"; Some "ほげ"|] (* 先頭からマッチさせる *) utop[28]> Re2.Regex.find_first re "aaaほげbbbaaaふがbbb";; - : bytes Or_error.t = Core_kernel.Result.Ok "aaaほげbbb" (* 先頭からのサブマッチ *) utop[29]> Re2.Regex.find_first re ~sub:(`Index 1) "aaaほげbbbaaaふがbbb";; - : bytes Or_error.t = Core_kernel.Result.Ok "ほげ" (* マッチした部分で文字列を分割する *) (* ~include_matches:true でマッチした文字列を含めることができる *) utop[30]> let sre = Re2.Regex.create_exn ",";; val sre : Re2.Regex.t = <abstr> utop[31]> Re2.Regex.split sre "あい,うえ,おお";; - : bytes list = ["あい"; "うえ"; "おお"]
マッチしない場合に例外となる関数も用意されている。
これらの関数は後ろに、_exnが付く。
utop[33]> Re2.Regex.find_first re "aaほげbbaaふがbb";; - : bytes Or_error.t = Core_kernel.Result.Error ("Re2_internal.Exceptions.Regex_match_failed(\"aaa(.*?)bbb\")") utop[34]> Re2.Regex.find_first_exn re "aaほげbbaaふがbb";; Exception: Re2_internal.Exceptions.Regex_match_failed("aaa(.*?)bbb").エンコーディングはデフォルトでUTF-8が使用されるようだ。
オプション指定により、Lantin-1として扱うこともできる。
オプションはRe2.Optionsモジュールに定義されている。
とりあえず、これだけ分かれば、正規表現を使った文字列処理は困らないかな。