NSRegularExpressionのめも

Obj-Cで正規表現が使えるNSRegularExpressionですがその際に少し引っかかったところがあるのでめも。
NSRegularExpressionの詳しい使い方についてはここには書いてないので別の所を見てくださいね。

NSRegularExpression* regexpattern =
[NSRegularExpression regularExpressionWithPattern:@"\"\\\\\s?(\w++)\""
options:0
error:&error];

とまあ""で囲われた//から始まる文字列をキャプチャするだけの何の訳にも立たなそうな正規表現ですが、記事にはうってつけなので。
この正規表現このままでは動かないんです。
見ればわかるのですがNSRegularExpressionの正規表現パターンっていうのはNSString型なのでその中の\(バックスラッシュ)はNSStringでのエスケープシーケンスとして認識されてしまうので、
実際にこのコードで渡る正規表現パターンは

"\\s?(w++)"

になるんですね。
これだと\一個にしかマッチしないし空白文字を期待する\sはただのsという文字になってしまいます。

そのためこいつを期待通りに走らせるためにはこんな感じに

regularExpressinWithPattern:@"\"\\\\\\\\\\s?(\\w++)\""

\を使う場合にはNSStringとしてのエスケープを回避するために、もう一個つけるわけなんですが、
最初の"のエスケープはNSStringのデリミタとしてのエスケープのため必要ないと。
でもってその後の\\\\\\\\はパターンとして渡るのが\\\\、まあ要するに\\にマッチしますよと。
そしてメタ文字の\sは\\sに、\wも同様。
うむ。実にややこしい。

要するにですね、NSRegularExpressionはパターンがNSStringなのがすべての元凶だと。そういう事なんですね。