2017-09-07 5 views
0

以上である必要があります。「a {m、n} =少なくともmですがn a以下」の場合、コードがtrueを返すのはなぜですか?Perlの正規表現は少なくとも一致しますが、

my $seq= "xxxx"; 
    print "bingo!" if ($seq =~ /x{2,3}/); 

n = 3で、文字列に4 x? nに関して、/a{m,n}/の定義に問題があると思います。結局のところ、ポイントは文字列に最大3 xがあることを確認することでした...または? 誰かが説明できますか? 私はそれがうまく動作しない場合の出現の最大値を指定しなければならないという論理を求めています。私は最大3と一致したいと意味し、文字列は4を意味する。私はTRUEになり、最大値は3と仮定します。実際には4です。 ありがとう。

+0

この3つの回答のうち、私の質問に対する答えは表示されません。指定しなければならない論理それがうまく動作しないときの出現の最大値。私は最大3と一致したいと意味し、文字列は4を意味する。私はTRUEになり、最大は3と仮定します。実際には4です。 – Megiddo

+1

あなたは完全な文字列と一致していません。 '/^x {2,3} $ /'は真となり、 '/^x {2,4} $ /'は真となります。 '/ x {2,3} /'がマッチすると '/^x {2,3} y /'は最後にyを加えたとしても、 – bytepusher

+1

文字列の最初の2文字は 'x'文字であるため、正規表現は一致します。つまり、文字列内に2または3 'xが続く1つ以上の点があります。文字列のそのポイントの後ろにさらに 'x'が続くという事実は、あなたの正規表現によって禁止されていません。 –

答えて

1

デフォルトでは、正規表現の正規表現はアンアンカーされています(これは正規表現の実装には当てはまりません)。これは、入力文字列に2または3のxを持つ部分文字列があれば、その文字列が成功したことを意味します。 。

my $seq= "xxxx"; 
print "bingo!" if ($seq =~ /([^x]|^)x{2,3}([^x]|$)/); 

も一致しないだろうが、いずれにもマッチします:

my $seq= "xxxx"; 
print "bingo!" if ($seq =~ /^x{2,3}$/); 

は、(それが一致する文字列だけが "XX" と "XXX" です

代わりに一致させるために失敗します2つまたは3つの連続したxを持つ文字列ですが、それらのxが長いxの文字列の一部でない場合は表示されません。

関連する問題