URLやパス、YYYY/MM/DD
形式の日付など、スラッシュを含むものに正規表現マッチをさせたいこともよく発生します。しかし、正規表現リテラルは両端がスラッシュとなるために、これらの文字列とヒットさせようとすればスラッシュをエスケープすることになってしまいます。…面倒ですよね?
Ruby
Rubyの場合、%記法という書き方のリテラルが存在します。%W
などはよく使われると思いますが、%r
を使えば正規表現を構築することも可能です(少なくともRuby 1.8.7からあります)。また、ふつうの正規表現リテラルと同様、末尾に修飾子を付けることもできます。
で、区切り文字としては英数字でなければ何でも使えます。正規表現のメタ文字を避けて、@
や!
、<>
などの中から、内部に現れない文字を選べばいいでしょう。
# 普通のリテラル
/\d{4}\/\d{2}\/\d{2}/m
# パーセント記法
%r@\d{4}/\d{2}/\d{2}@m
PHP
PHPに正規表現リテラルは存在しないのですが、PCRE(preg_
で始まる関数群)を使う場合、修飾子の都合もあってか、'/regex/'
のようにデリミタ付きの文字列を指定します。
…ですが、実はこのデリミタには多くの文字を指定できます(英数字、スペース、バックスラッシュ以外)。PHPのマニュアルでは、スラッシュ以外に#
や~
をすすめています。
// スラッシュ区切り
preg_match('/\d{4}\/\d{2}\/\d{2}/u',$haystack);
// #区切り
preg_match('#\d{4}/\d{2}/\d{2}#u',$haystack);
まとめ
正規表現を連ねていくと、加速度的に読みにくくなります。記法の工夫で少しでも読みやすくなるなら、しておいて損はないでしょう。