2016-11-20 4 views
3

質問preg_match_all how to get *all* combinations? Even overlapping onesと似たようなことをしたいと思います。パターンが重複していても一致するパターンを見つけることができます。ちょうど最初のもの)。preg_match_allと重複して一致するパターンと繰り返し文字で終了するパターン

しかし、追加の制約があります。私のパターンは繰り返し指定子で終わることができます。のは、一例として+を使用してみましょう:インデックス0から始まるインデックス1

  • マッチ"A"から始まるインデックス0
  • マッチ"A"から始まる

    • マッチ"AA":これは、パターン/A+/と対象"AA"は3試合を返すべきこと

    上記の質問に示された解決策に基づいて、以下のパターンは、3つの結果すべてに一致しません。

    • /(?=(A+))/は最初の2試合を見つけなく、最後の1
    • /(?=(A+?))/は、最後の2試合ではなく、今の最初の1つの

    私の唯一の回避策は貪欲を維持することです見つけました例えば、それはもはや一致しなくなるまでこの操作を繰り返し、各試合マイナスその最後の文字に対してパターンを適用したバージョンと試してみてください。

    $all_matches = array(); 
    $pattern = 'A+'; 
    
    preg_match_all("/(?=($pattern))/", "AA", $matches, PREG_SET_ORDER); 
    
    foreach ($matches as $match) { 
        do { 
         $all_matches[] = $match[1]; 
         $subject = substr($match[1], 0, -1); 
        } 
        while (preg_match("/^($pattern)/", $subject, $match)); 
    } 
    

    は、任意のはありますpreg_match_allなどを使用してこれを達成するためのより良いソリューションですか?

  • +0

    あなたは1つの正規表現マッチング操作では不可能で一つの指標、でいくつかの試合を取得したいです。あなたは実際には純粋な正規表現の解決法を望んでいません。 1)文字列の部分文字列のすべての組み合わせを見つけ、2)パターンと完全に一致する部分文字列のみを保持する必要があります。 –

    答えて

    1

    1つのインデックスで複数の一致を取得する必要があります.1つの正規表現の一致操作では不可能です。あなたは、実際には完全にあなたのパターンに一致するものを維持し、あなたの文字列と

  • から部分文字列のすべての組み合わせを探す

    • する必要があります。

    PHP demoを参照してください:

    function find_substrings($r, $s) { 
        $res = array(); 
        $cur = ""; 
        $r = '~^' . $r . '$~'; 
        for ($q = 0; $q < strlen($s); ++$q) { 
        for ($w = $q; $w <= strlen($s); ++$w) { 
         $cur = substr($s, $q, $w-$q); 
         if (preg_match($r, $cur)) { 
          array_push($res, $cur); 
         } 
        } 
        } 
        return $res; 
    } 
    print_r(find_substrings("ABA", "ABABA")); 
    // => Array ([0] => ABA [1] => ABA) 
    print_r(find_substrings("A+", "AA")); 
    // => Array ([0] => A [1] => AA [2] => A) 
    
  • +0

    あなたの答えと問題の明確な言い換えをありがとう!これは 'preg_match_all'を使っているようですが、長さゼロの先読みトリックでは少し機能が向上しますが、結果は同等です。私はもう少し検索を行い、おそらくそれを使用して終了します:) – r3c

    関連する問題