bugfix> regex > 投稿

正確に3回のスラッシュを含む単語を一致させる方法はほとんどありませんが、機能しません。以下に例を示します

@array = qw( abc/ab1/abc/abc a2/b1/c3/d4/ee w/5/a  s/t )
foreach my $string (@array){
    if ( $string =~ /^\/{3}/ ){
          print " yes, word with 3 / found !\n";
          print "$string\n";
    }
    else {
          print " no word contain 3 / found\n";
    }

私が試しているマクシングはほとんどありませんが、どれも動作しません

$string =~ /^\/{3}/;
$string =~ /^(\w+\/\w+\/\w+\/\w+)/;
$string =~ /^(.*\/.*\/.*\/.*)/;

他の方法でこのタイプの文字列と一致し、文字列を印刷できますか?

回答 4 件
  • グローバルに一致し、一致数を 3 と比較します

    if ( ( () = m{/}g ) == 3 ) { say "Matched 3 times" }
    
    

    ここで、 ()=  operatorはコンテキストの再生であり、右側にリストコンテキストを強制しますが、左側にスカラーコンテキストが提供されるとそのリストの要素の数を返します。

    このような構文ストレッチに不安がある場合は、配列に割り当てます

    if ( ( my @m = m{/}g ) == 3 ) { say "Matched 3 times" }
    
    

    ここで、後続の比較はスカラーコンテキストで評価します。

    3つ合わせようとしています連続した  /  そして、あなたの文字列にはそれがありません。

  • 必要なパターン(空白を追加)は

    ^ [^/]* / [^/]* / [^/]* / [^/]* \z
    
    

    または

    ^ [^/]* (?: / [^/]* ){3} \z
    
    

    2回目の試みは近かったが、 ^ を使用した   \z なし  あなたが文字列をチェックしたのでそれを作りました起動 あなたのパターンで。


    ソリューション:

    say for grep { m{^ [^/]* (?: / [^/]* ){3} \z}x } @array;
    
    

    または

    say for grep { ( () = m{/}g ) == 3 } @array;
    
    

    または

    say for grep { tr{/}{} == 3 } @array;
    
    

  • あなたは一致する必要があります

    スラッシュ

    いくつかの非スラッシュ( ^(?:[^\/]*

    マッチを正確に3回繰り返す

    行の先頭および行のアンカーでトリプル全体を囲む:

    $string =~ /^(?:[^\/]*\/[^\/]*){3}$/;
    
    

  • if ( $string =~ /\/.*\/.*\// and $string !~ /\/.*\/.*\/.*\// )
    
    

あなたの答え