最近、正規表現という便利なものを使うようになったのだが、少し躓いたので適当に書き残しておく。(ブログ更新のネタがないので捻り出した。)


正規表現、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はマッチしてくれないのでチンポ推しとしては悲しい限りです。

【Regex】正規表現のMultilineと$と改行文字の罠

投稿ナビゲーション


コメントを残す

メールアドレスが公開されることはありません。