このすみノート

Webエンジニアが技術や趣味を書くブログです。

正規表現の中にコメントを含める、/xオプションによるフリーフォーマット記法について

詳説正規表現を読んでいるのですが、正規表現の中にコメントを含める方法を知りました。 実際にいくつかのプログラミング言語で試してみたので、ご紹介します。

PHP

PHPでは、preg_match()に/xオプションを追加します。 /xオプションはフリーフォーマットと呼ばれる記法で、正規表現の中に、任意のコメントや空白を含めることができます。

複雑な正規表現を書きたいときに便利です。 空白によるインデントやコメントを活用して、複雑な正規表現でも可読性を保てます。

<?php

$number = "abcde12345";
preg_match("/
    # コメントが記述できます
    # フリーフォーマット
    (\d+)
/x", $number, $matches1);
// string(5) "12345"
var_dump($matches1[1]);

preg_match("/(?# この中はコメントが書けます)(\d+)/", $number, $matches2);
// string(5) "12345"
var_dump($matches2[1]);

Perl

PHPの正規表現はPCRE(Perl Compatible Regular Expressions)ということもあり、Perlでももちろんコメントが書けます。

my $number = "abcde12345";

# 12345 at test.pl line 3.
warn $number =~ m/
    # コメントが記述できます
    # フリーフォーマット
    (\d+)
/x;

# 12345 at test.pl line 9.
warn $number =~ m/(?# この中はコメントが書けます)(\d+)/;

Ruby

Rubyでも、/xオプションを使ったフリーフォーマット記法が使えます。

number = "abcde12345";

/   # コメントが記述できます
    # フリーフォーマット
    (?<num1>\d+)
/x =~ number;
# 12345
print(num1, "\n")

/(?# この中はコメントが書けます)(?<num2>\d+)/ =~ number
# 12345
print(num2, "\n")

まとめ

いくつかのプログラミング言語で試してみたのですが、/xオプションによる正規表現のフリーフォーマットは、とても便利であることがわかりました。

正規表現は括弧が入り組んだりすると、途端に複雑に見えてしまうことがあります。 今後、少しでも複雑な正規表現を書くときは、フリーフォーマット記法を活用していきたいです。

フリーフォーマットの注意点

フリーフォーマットの注意点として、すべての言語に実装されているわけではないようです。 これは言語実装によるのですが、たとえば私が調べた限り、JavaScriptには同様の機能がなさそうでした。

ただ、JavaScriptの正規表現にも、フリーフォーマットがあってもよさそうな気がします。 私の調査力が不足しているだけかもしれませんので、念の為、もう少し調査してみようと思います。

詳説 正規表現 第3版

詳説 正規表現 第3版