2009-10-16 11 views
5

Virgülle ayrılmış değerler listesini doğrulamak için aşağıdaki normal ifadeyi kullanıyorum.Ayrık değerlerin virgülle ayrılmış bir listesi için düzenli bir ifade var mı?

^Dog|Cat|Bird|Mouse(, (Dog|Cat|Bird|Mouse))*$ 

değerleri, Excel hücre doğrulaması listeden bir açılır listelenen, böylece kullanıcı listesi açılan tek bir değer seçmek, veya virgülle ayrılmış birden çok değerler de olabilir.

Düzenli ifade, kullanıcının bir şey girmesini ancak onaylanan değerleri girmesini engellemek için iyi bir iştir, ancak kullanıcının çiftleri girmesini engellemez. Örneğin, kullanıcı "Köpek" ve "Köpek, Kedi" girebilir, ancak kullanıcı "Köpek, Köpek" de girebilir.

Benzer tek bir normal ifadeyi kullanarak kopyaları önlemek için herhangi bir yolu var mı? Başka bir deyişle, onaylanmış virgülle ayrılmış değerlerin ayrı bir listesini uygulayabilmem gerekir.

Teşekkürler!

cevap

10

, geribaşvuru ve bir negatif ileri yönlü kullanın:

^(Dog|Cat|Bird|Mouse)(, (?!\1)(Dog|Cat|Bird|Mouse))*$ 

EDIT: Bu Bir gelmek gerekir ... Böyle "Kedi, Köpek, Köpek" olarak vakalarla çalışmaz Bu tür örnekler için karma çözüm - Bunu kaldırabilecek tek bir normal ifade olduğuna inanmıyorum.


İşte başka bir teknik.

(?:(?:^|,)(Dog|Cat|Bird|Mouse))+$ 

Sonra

, bu maç ETMEZ olmadığını kontrol (Yani orijinal regex sadece biraz daha kısa versiyonu): Sen bu maç ETMEZ ki, önce, iki şeyi kontrol etmeniz gerekir:

Eg Ben herhangi bir virgülle ayrılmış dizede çiftlerini arayabilirsiniz diye

var valid = string.match(/(?:(?:^|,)(Dog|Cat|Bird|Mouse))+$/) && 
      !string.match(/(Dog|Cat|Bird|Mouse).+?\1/); 
+0

Yup, kapatın ama "Kedi, Köpek, Köpek" yakalamıyor. Teşekkürler! – Kuyenda

+0

Bu işe yarayıp yaramadığını bilmiyorum ama belki arka referansı yapabilirsin (?! (\ 1 | \ 2 | \ 5 | \ 8) ve * 'yi değiştirmek için 4. Sanırım bu patlayabilir. Ancak yakalama grupları mevcut değil, denemedim, sadece bir düşünce. – Tim

+0

Neden "\ 1 \ 2 \ 5 \ 8"? "\ 1 \ 2 \ 3 \ 4" olmaz mı? Teşekkürler ! – Kuyenda

0

J-P, senin örnek Düzenli ifadeleri düzenlemek çalıştı. Bunun gibi bir şey: Ne yazık ki başarısız oldum. Güç benimle zayıf. ;)

Yardımlarınız için tekrar teşekkürler.

İlgili konular