2012-10-13 8 views

Odpowiedz

38

Spróbuj tego, może pracować,

^(?:([A-Za-z])(?!.*\1))*$ 

Wyjaśnienie

Assert position at the beginning of a line (at beginning of the string or after a line break character) «^» 
Match the regular expression below «(?:([A-Z])(?!.*\1))*» 
    Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 
    Match the regular expression below and capture its match into backreference number 1 «([A-Z])» 
     Match a single character in the range between “A” and “Z” «[A-Z]» 
    Assert that it is impossible to match the regex below starting at this position (negative lookahead) «(?!.*\1)» 
     Match any single character that is not a line break character «.*» 
     Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 
     Match the same text as most recently matched by capturing group number 1 «\1» 
Assert position at the end of a line (at the end of the string or before a line break character) «$» 
+0

Doskonały, dzięki! – alfasin

+2

@JohnWoo Zastanawiam się, jakie narzędzie użyłeś do wygenerowania wyjaśnienia? – turtledove

+0

@JohnWoo Dzięki, świetne narzędzie! – turtledove

11

Można sprawdzić, czy istnieją 2 wystąpienia znaku w ciągu znaków:

^.*(.).*\1.*$ 

(Po prostu przechwytuję jedną z postaci i sprawdzam, czy ma kopię w innym miejscu z referencją wsteczną. Reszta .* nie jest troskliwa).

Jeśli powyższe wyrażenie jest zgodne, łańcuch ma powtarzający się znak. Jeśli powyższe wyrażenie nie pasuje, wszystkie znaki są unikalne.

Dobrą rzeczą w powyższym wyrażeniu jest to, że silnik regex nie obsługuje rozglądania się.

Najwyraźniej rozwiązanie Johna Woo to piękny sposób na bezpośrednie sprawdzenie unikalności. Przy każdym znaku stwierdza się, że ciąg naprzód nie będzie zawierał bieżącego znaku.

+1

Prosty i skuteczny. Jeszcze łatwiej zobaczyć bez zakotwiczeń: '(.). * \ 1' – pabo

0

Ten również zapewnić pełne dopasowanie do dowolnej długości słowa z nie-powtarzanie liter:

^(?!.*(.).*\1)[a-z]+$ 

Ja nieznacznie zmieniłem answer dostarczony przez @Bohemian na inne pytanie jakiś czas temu, aby uzyskać jest.

Minęło trochę czasu, odkąd pytanie powyższe zostało zadane, ale pomyślałem, że byłoby miło również mieć ten wzór regex tutaj.

Powiązane problemy