php preg_match aynı desen için kibrit farklı sayıda dönen

1 Cevap php

Ben dönüştürücü tamsayı romen rakamıyla ile preg_match dışarı çalışıyorum. Sorun belirli girişler için, preg_replace çok az sonuç veriyor gibi görünüyor olduğunu. Kodu:

function romanNumeralToInt($romanNumeral)
{   preg_match
    (   '/^(M?M?M?)'
        .'((CM)|(CD)|((D?)(C?C?C?)))'
        .'((XC)|(XL)|((L?)(X?X?X?)))'
        .'((IX)|(IV)|((V?)(I?I?I?)))$/', $romanNumeral, $match);
    print_r($match);

    $result=0;
    $result += 1000*strlen($match[1]);
    if(strlen($match[3]) != 0){$result += 900;}
    if(strlen($match[4]) != 0){$result += 400;}
    if(strlen($match[5]) != 0)
    {   $result += 100*strlen($match[7]) + 500*strlen($match[6]);
    }
    if(strlen($match[9]) != 0){$result += 90;}
    if(strlen($match[10]) != 0){$result += 40;}
    if(strlen($match[11]) != 0)
    {   $result += 10*strlen($match[13]) + 50*strlen($match[12]);
    }
    if(strlen($match[15]) != 0){$result += 9;}
    if(strlen($match[16]) != 0){$result += 4;}
    if(strlen($match[17]) != 0)
    {   $result += 1*strlen($match[19]) + 5*strlen($match[18]);
    }

    return $result;
}

echo romanNumeralToInt("XXVIII"); // gives correct results

Ama "IV" ile biten herhangi bir Romen rakamı son 3 maçı ($ maçlar yalnızca yerine tam 0-19 daha elementlerden 0-16 içerecektir) keseceğim ve benzer "IX" ile biten herhangi bir Romen rakamı son kesecek 4. maçlar.

Bu beklenen davranıştır, ya da benim PHP adamcağız?

1 Cevap

Ben bu beklenen davranış olmasını bekliyoruz. =)

Regex eşleştirmeye çalışır VEYA kısa sürede bir eşleşme bulur olarak durdurma, soldan sağa grupları, bu yüzden bir IV veya IX bulursa bu son üç (ya da dört) grupları maç için deneyin asla.

Aslında, ben senin ifade CM veya XL veya bunun gibi bir şey içeriyorsa, diğer girdilerden bazıları da eksik olacaktır, diye düşünüyorum.

Ben kullanarak RegExr düzenli ifadeleri hata ayıklama ile çok yardımcı olur bulabilirsiniz. Lütfen regex için bu kullanarak, bazı gruplar boş dizeleri yakalamak ve bazı gruplar UYGUNU içerir.