2014年5月17日土曜日

[OCaml]PCRE-OCamlのサンプルコード

OCamlの正規表現ライブラリはいくつかあるようだけど、PCRE-OCamlがお手軽そうだったので、使ってみた。
メモしておこう。

PCRE-OCamlはopamでインストールできる。
$ opam install pcre-ocaml

以下、utopでの例。

utop[0]> #require "pcre";;
utop[1]> open Pcre;;

execはsubstringsを返す。

utop[16]> let s = exec ~rex:(regexp "aaa(.*)bbb") "aaaほげbbbほげccc";;
val s : substrings = <abstr>

get_substringsでstring arrayを取得できる。

utop[17]> get_substrings s;;
- : string array = [|"aaaほげbbb"; "ほげ"|]
utop[18]> (get_substrings s).(0);;
- : string = "aaaほげbbb"

マッチしないときは例外が出る。

utop[42]> let s = exec ~rex:(regexp "ほげげ") "aaaほげbbb";;
Exception: Not_found.

exec_allはsubstrings arrayを返す。

utop[36]> let sa = exec_all ~rex:(regexp "aaa(.*?)aaa") "aaaほげ1aaa aaaほげ2aaa";;
val sa : substrings array = [|<abstr>; <abstr>|]
utop[37]> get_substrings sa.(0);;
- : string array = [|"aaaほげ1aaa"; "ほげ1"|]
utop[38]> get_substrings sa.(1);;
- : string array = [|"aaaほげ2aaa"; "ほげ2"|]

マッチした文字列の配列を返すextract, extract_all関数もある。(こちらの関数の方が扱いが簡単。)

utop[48]> extract ~rex:(regexp "aaa(.*?)aaa") "aaaほげ1aaa aaaほげ2aaa";;
- : string array = [|"aaaほげ1aaa"; "ほげ1"|]

utop[49]> extract_all ~rex:(regexp "aaa(.*?)aaa") "aaaほげ1aaa aaaほげ2aaa";;
- : string array array =
[|[|"aaaほげ1aaa"; "ほげ1"|]; [|"aaaほげ2aaa"; "ほげ2"|]|]

UTF-8で日本語を使うときには、フラグ指定で、
regexp ~flags:[`UTF8] "aaa(.*?)aaa"
としておいた方が良いかな?

参考