PHP regex Bug

4 Cevap php

Ben en azından başka maçta aynı rakamın iki, 0 varsa "1" yazdırmak çalışıyorum.

What is wrong in the regex?

if ( max ( array_map ('strlen', preg_split('/([0-9])[^0-9]*\1/', "1 2 3 1 4") ) ) == 1 )
        echo 1;
else
        echo 0;

4 Cevap

echo preg_match('/(?<=^|[^0-9])([0-9)+)(?=[^0-9]).*(?<=[^0-9])\1(?=[^0-9]|$)/', "1 2 3 1 4");

Dizisindeki herhangi bir tekrarlanan sayı için maç ve tekrarlanan bir şey, değilse 0 varsa 1 yankılanacak.

(Original version sadece bu dize her yerde tekrarlanan maçlar, birbirinden sonra tekrarlanan bir şey baktı)

[^ 0-9] * OLMAYAN haneli herhangi bir sayıda karakterle eşleşir. Yani başka bir numara varsa, bu maçı başarısız olur. Bir basit [^ 0-9] * değiştirmeyi deneyin. *, Basamak veya non-basamak maç olacak hangi.

Aşağıdaki kodu deneyin. Bir tekrar sayısı olduğunda bu 1 yazdırır.

if(0 == strlen(preg_replace('/.*([0-9]).+\1.*/', '', '1 2 3 1 5 4')))
     echo 1;
else echo 0;

Regex /.*([0-9]).+\1.*/ (.+ ile veya aralarında bir şey) bir numarası ve başka bir numara maç olacak.

Umarım bu yardımcı olur.

Bir lookahead onaylama deneyin. Ben bir şey anlamaya çalışıyorum zaman ben "Regex Coach" kullanın. Size bir ipucu veya bir şey vermez, ama hemen geri vermez.

Test string: "1 2 3 1 4 3"
Regex: ([0-9])(?=.*\1)

Temelde () 'ın [0-9] etrafında sonucu depolamak ve ileri yönlü (= karşılaşmalar * -. Herhangi bir karakter ve sonra \ 1 - eşleşen birinci (yani herhangi bir sayı arar ve ardından önde görünüyor ne bu rakam yine oluşursa bakınız)

Bu, hem "1" ve "3" maç olacak

Php lookaheads destekliyorsa ise oldukça emin değilim, ama bu benim almak bulunuyor.