45
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

まだ正規表現のスラッシュエスケープで消耗しているの?

Posted at

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);

まとめ

正規表現を連ねていくと、加速度的に読みにくくなります。記法の工夫で少しでも読みやすくなるなら、しておいて損はないでしょう。

45
37
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?