Archive for 2010年10月22日|Daily archive page

正規表現表記の覚え書4。。。または、改行を含む文字列の扱い方

 前回EPUB Viewer のスクリプトの変更部分:

    (let (book (replace {<\?.+\?>} (read-file file) "" 0))
       (replace {<meta http-equiv[^>]*>} book "" 4)

 の正規表現オプションで 4 を指定しています。
 マニュアルで正規表現オプションは、

PCRE name no description
PCRE_CASELESS 1 大文字を小文字として扱う
treat uppercase like lowercase
PCRE_MULTILINE 2 Perl の /m のように改行で検索が制限されます。
(訳注: 行頭 (^) と行末 ($) が一行毎に使えるようになる )
limit search at a newline like Perl’s /m
PCRE_DOTALL 4 . (dot) が改行にもマッチします。
. (dot) also matches newline
PCRE_EXTENDED 8 文字クラス内以外の空白文字を無視します。
ignore whitespace except inside char class
PCRE_ANCHORED 16 (訳注:検索位置を)文字列の先頭に固定します。
anchor at the start
PCRE_DOLLAR_ENDONLY 32 $ は、改行の前ではなく、文字列の最後でマッチします。
$ matches at end of string, not before newline
PCRE_EXTRA 64 この付加機能は、現在使えません。
additional functionality currently not used
PCRE_NOTBOL 128 最初の文字は、行の先頭でないので、^ で一致しません。
first ch, not start of line; ^ shouldn’t match
PCRE_NOTEOL 256 最後の文字は、行の終わりでないので、$ で一致しません。
last char, not end of line; $ shouldn’t match
PCRE_UNGREEDY 512 数量詞の貪欲さを反転します。
invert greediness of quantifiers
PCRE_NOTEMPTY 1024 空文字列は、無効になります。
empty string considered invalid
PCRE_UTF8 2048 パターンと文字列が、UTF-8文字になります。
pattern and strings as UTF-8 characters
REPLACE_ONCE 0x8000 replaceで使われた時のみ、一回だけ置換されます。
replace only one occurrence only for use in replace
PRECOMPILED 0x10000 パターンは、プリ・コンパイルされ、RREPLACE_ONCE 0x8000とだけ結合できます。
pattern is pre-compiled, can only be combined with RREPLACE_ONCE 0x8000

 となっていて、4 は “. (dot) が改行にもマッチします。” とあります。
 どうやら、改行を含んだ文字列を扱う時は、4 を指定したほうが良さそうです。
 冒頭の正規表現表記では、. (dot) を含んでいないので 4 は要りません。
 でも私の場合、このように blog に書いておいても忘れますから、こうして置いたほうが、無難です。
 後で変更するかもしれませんからね(汗)。

 以上、如何でしょうか?