2

URL の / の後の「ホーム」という単語だけをテストする簡単なテストをセットアップしました。先読み/後読みなしで動作していますが、それらを使用して同じことをしたいと考えています。

my $page = "/Home"; #should 'match'
#or
$page = "/New Homes"; #should 'no match'

#A
if ($page =~ /Home | Home/) {
    print "no match A";
} else {
    print "match A";
}
print "\n\n";

#B
if ($page =~ /(?<= )Home(?= )/) {
    print "no match B";
} else {
    print "match B";
}

戻り値:

no match A
match B #incorrect

それで、私は何を得ていないのですか?

4

3 に答える 3

2

あなたの例では:

(?<= )Home(?= )

ここで行っているのは、ホームの前後の空白 (または空白) を検索することです。括弧内に検索文字列を入れたいとします。/これを使用する前に検索するにはhome

(?<=\/)Home

また、注記として、先読みと後読みでは、それらは一致として返されず、一致を見つけるためにのみ使用されます。したがって、上記の例ではHome、 ではなく、一致として返され/Homeます。

注: コメントで指摘されているように、perl では/をエスケープする必要があります。エスケープされた を含むようにコードを編集しました/

于 2012-12-07T21:43:19.107 に答える
1

なぜこれらの 2 つのパターンが同等であると考えるのかわかりません。

/(?<= )Home(?= )/

と同じ文字列にマッチします

/ Home /

一致にスペースを含めずに、および

/Home(?= )|(?<= )Home/

と同じ文字列にマッチします

/Home | Home/

一致にスペースを含めずに。


あなたはおそらく欲しい:

m{(?<![^/])Home(?![^/])}

に似ている

m{(?<=/)Home(?=/)}

except(?<![^/])は、文字列の先頭に(?![^/])も一致し、文字列の末尾にも一致します。

于 2012-12-08T02:14:49.937 に答える
0

あなたのコードは私を混乱させ、おそらくあなたも混乱させます。

これ

my $page = "\/Home"; #should 'match'
#or
$page = "\/New Homes"; #should 'no match'

と同等です

my $page = '/New Homes';

リテラル文字列のスラッシュをエスケープする必要はなく、変数の補間が必要でない限り二重引用符を使用する必要もないためです。

これも

if ($page =~ /Home | Home/) {
    print "no match A";
} else {
    print "match A";
}

no match A一致する場合に出力し、その逆も同様であるため、 の出力は に表示されるようno match Aに正しいものになります。' Home' $page

気になる状態

if ($page =~ /(?<= )Home(?= )/) {
    print "no match B";
} else {
    print "match B";
}

一致したときに出力されるという同じ問題no match Bがあります。を探しておりHome、前後にスペースがあります。前にスペースがなく、その後にスペースがないものを$page含みます。一致がないので、そう言います。'/New Homes''Home'match B

matchと の意味を修正し、とno matchを追加use strictして、プログラムのこの変形を試してくださいuse warnings

use strict;
use warnings;

my $page = '/New Homes';

if ($page =~ /Home | Home/) {
  print 'match A';
}
else {
  print 'no match A';
}

print "\n\n";

if ($page =~ /(?<= )Home(?= )/) {
  print 'match B';
}
else {
  print 'no match B';
}

出力

match A

no match B
于 2012-12-07T23:31:29.317 に答える