今日、Perl 正規表現の一致で 2 つの異なる構文に遭遇しました。
#I have a date string
my $time = '2012-10-29';
#Already familiar "m//":
$t =~ m/^(\d{4}-\d\d-\d\d)$/
#Completely new to me m##.
$t =~ m#^(\d{4}-\d\d-\d\d)#/
/expression/
とはどう違い#expression#
ますか?
Perlでは、正規表現を含め、ほとんどすべての文字を使用して文字列を区切ることができます。これは、スラッシュ文字を多く含むパターンに一致させる必要がある場合に特に便利です。
$slashy =~ m/\/\//; #Bad
$slashy =~ m|//|; #Good
ドキュメントによると、それらの最初のものは「傾いた楊症候群」の例です。
すべてではありませんが、ほとんどのキャラクターはエスケープ時に同じように動作します。重要な例外があります。これは、m?...?
への呼び出し間で1回だけ一致する特殊なケースですreset()
。
別の例外:区切り文字に一重引用符が使用されている場合、変数の補間は行われません。$
ただし、行末に一致する特殊文字であるため、エスケープする必要があります。
他の人が言ったように、 . の後に任意の区切り文字を使用できますm
。
/
特別な機能が 1 つあります。たとえば、単独で使用できます。
$string =~ /regexp/;
次と同等です。
$string =~ m/regexp/;
一致または検索/置換演算子 (それぞれ them
およびs
) の後に、任意の文字を区切り文字として使用でき#
ます。これは、括弧のペアでも機能します: s{ abc (.*) def }{ DEF $1 ABC }x
.
利点は、エスケープする必要がないことです/
(ただし、実際の区切り文字はもちろん)。特にパスやプロトコルなどを扱う場合は、明確にするためによく使用されます。
正規表現でエスケープする必要があるもの以外は何もありません。マッチした文字の任意のペアを使用できます。
$string = "http://example.com/";
$string =~ m!http://!;
$string =~ m#http://!#;
$string =~ m{http://};
$string =~ m/http:\/\//;
違いはありません; 「/」および「#」文字は、式の区切り文字として使用されます。それらは式の「境界」を示すだけで、式の一部ではありません。理論的には、英数字以外のほとんどの文字を区切り文字として使用できます。Perl互換の正規表現構文に関するPHPマニュアルへのリンクです(PHPマニュアルであるかどうかは関係ありません。正規表現構文は同じです。よく説明されているので気に入っています)。区切り記号に関する部分を読む