2009-10-16 10 views
5

Używam następującego wyrażenia regularnego do sprawdzania wartości rozdzielonych przecinkami.Czy istnieje wyrażenie regularne dla rozdzielonej przecinkami listy dyskretnych wartości?

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

Wartości są podane w liście rozwijanej walidacji komórek Excel dół, tak więc użytkownik może wybrać jedną wartość z listy rozwijanej lub typu w wielu wartości oddzielony przecinkami.

Wyrażenie regularne dobrze zapobiega wprowadzeniu przez użytkownika niczego oprócz zatwierdzonych wartości, ale nie zapobiega wprowadzeniu przez użytkownika duplikatów. Na przykład użytkownik może wpisać "Pies" i "Pies, kot", ale użytkownik może również wpisać "Pies, pies".

Czy istnieje sposób na uniknięcie duplikatów przy użyciu podobnego pojedynczego wyrażenia regularnego? Innymi słowy, muszę mieć możliwość wymuszenia dyskretnej listy zatwierdzonych wartości rozdzielanych przecinkami.

Dzięki!

Odpowiedz

10

Użyj wstecznych i negatywny uprzedzona:

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

EDIT: To nie będzie działać z przypadków, takich jak „kot, pies, Dog” ... Musisz wymyślić rozwiązanie hybrydowe dla takich przypadków - nie sądzę, że istnieje jedno wyrażenie regularne, które może sobie z tym poradzić.


Oto kolejna technika. Trzeba sprawdzić dwie rzeczy, po pierwsze, że zgadza się z tym:

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

(To jest tylko nieznacznie krótsza wersja oryginalnego regex)

Następnie należy sprawdzić, czy nie zgadza się z tym:

(Dog|Cat|Bird|Mouse).+?\1 

Np

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

Tak, blisko, ale nie łapie "Kot, pies, pies". Dzięki! – Kuyenda

+0

Nie wiem, czy to zadziała, ale może uda ci się wykonać referencję zwrotną (?! (\ 1 | \ 2 | \ 5 | \ 8) i zmienić * na 4. Myślę, że może to spowodować wybuch, jeśli grupy przechwytywania nie istnieją, ale nie próbowałem, po prostu myśl – Tim

+0

Dlaczego "\ 1 \ 2 \ 5 \ 8"? Czy nie byłoby "\ 1 \ 2 \ 3 \ 4"? Dzięki ! – Kuyenda

0

J-P, Próbowałem edycji wyrażeń regularnych próbkę tak, że mogę wyglądać duplikaty w dowolnym oddzielone przecinkami ciąg. Coś takiego:

var valid = string.match(/(?:(?:^|,)([a-z]*))+$/) && 
    !string.match(/([a-z]*).+?\1/); 

Niestety, nie udało mi się. Moc jest słaba ze mną. ;)

Jeszcze raz dziękuję za pomoc.