最近、正規表現という便利なものを使うようになったのだが、少し躓いたので適当に書き残しておく。(ブログ更新のネタがないので捻り出した。)
正規表現、RegularExpressionを略してRegex。えらく語呂のいい略し方をしたものだと勝手に感心している。ご存知の通りRegexはパターンとマッチする表現を文中から見つけてくれる便利な代物である。
さて、Regexにはいろいろオプションがある。IgnoreCaseとか、Multilineとか、まあ言語によって異なるが、多分ある程度はどの言語にも共通してあるんじゃなかろうかと思う。
そのMultilineだが、これは文字列の最後にマッチするアンカーの$
を各行末にもマッチするようにしてくれる便利オプションである。行末ってどこかというと、改行文字すなわちLF(\n
)の直前である。例えば、
sax
six
sex
sox
とかいう文字列があったとすると、"s.x$"
というパターンにsax,six,sex,sox
がマッチする。Multilineがなければ、sox
だけである。
ところが、Windows環境下でさっきの文字列を読み込ませると、Multilineがあってもsox
しかマッチしなくなる。理由は単純で、Windowsの改行文字はCR+LF(\r\n
)だからだ。\n
の前がx
ではなくて\r
なのでマッチしないのだ。
ちなみにWindowsのメモ帳ではLF単体だと表示も改行もされない。しかし文字のデータとして存在はしているので、カーソルを移動させるとLFのところで一旦止まるのが確認できる。
なお、UNIX系とMacOS Xはちゃんと(?)LFを使っている。しかし、MacOSも9以前は改行文字がCRだったので、かつてはてんでバラバラだったことになる。
というわけで、これを解決するには\n
の前のゴミを無視するために"s.x\r?$"
にすればOKである。あるいは、元の文字列から\r
を取り除くために\r
を空文字列で置換しておくのも手かもしれない。
ちなみに、Multilineを有効にすると文字列の先頭にマッチするアンカーの^
も行頭にマッチしてくれる。こちらはLFの直後なのでどの環境でもきちんとマッチする。
余談
".*nko"
にマッチする文字列ランキングTOP3を発表します。
1位 unko
2位 manko
3位 chinko
chimpoはマッチしてくれないのでチンポ推しとしては悲しい限りです。