8

今日、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#ますか?

4

5 に答える 5

9

Perlでは、正規表現を含め、ほとんどすべての文字を使用して文字列を区切ることができます。これは、スラッシュ文字を多く含むパターンに一致させる必要がある場合に特に便利です。

$slashy =~ m/\/\//;   #Bad
$slashy =~ m|//|;   #Good

ドキュメントによると、それらの最初のものは「傾いた楊症候群」の例です。

すべてではありませんが、ほとんどのキャラクターはエスケープ時に同じように動作します。重要な例外があります。これは、m?...?への呼び出し間で1回だけ一致する特殊なケースですreset()

別の例外:区切り文字に一重引用符が使用されている場合、変数の補間は行われません。$ただし、行末に一致する特殊文字であるため、エスケープする必要があります。

于 2012-10-18T08:37:19.597 に答える
9

他の人が言ったように、 . の後に任意の区切り文字を使用できますm

/特別な機能が 1 つあります。たとえば、単独で使用できます。

$string =~ /regexp/;

次と同等です。

$string =~ m/regexp/;
于 2012-10-18T08:30:58.050 に答える
3

一致または検索/置換演算子 (それぞれ themおよびs) の後に、任意の文字を区切り文字として使用でき#ます。これは、括弧のペアでも機能します: s{ abc (.*) def }{ DEF $1 ABC }x.

利点は、エスケープする必要がないことです/(ただし、実際の区切り文字はもちろん)。特にパスやプロトコルなどを扱う場合は、明確にするためによく使用されます。

于 2012-10-18T08:20:40.020 に答える
3

正規表現でエスケープする必要があるもの以外は何もありません。マッチした文字の任意のペアを使用できます。

$string = "http://example.com/";
$string =~ m!http://!;
$string =~ m#http://!#;
$string =~ m{http://};
$string =~ m/http:\/\//;
于 2012-10-18T08:18:35.513 に答える
1

違いはありません; 「/」および「#」文字は、式の区切り文字として使用されます。それらは式の「境界」を示すだけで、式の一部ではありません。理論的には、英数字以外のほとんどの文字を区切り文字として使用できます。Perl互換の正規表現構文に関するPHPマニュアルへのリンクです(PHPマニュアルであるかどうかは関係ありません。正規表現構文は同じです。よく説明されているので気に入っています)。区切り記号に関する部分を読む

于 2012-10-18T08:22:26.823 に答える