2012-10-13 8 views

Antwort

38

Versuchen Sie diese, es könnte funktionieren,

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

Erklärung

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

Perfekt, danke! – alfasin

+2

@JohnWoo Ich frage mich, mit welchem ​​Werkzeug Sie die Erklärung erstellt haben? – turtledove

+0

@JohnWoo Danke, tolles Werkzeug! – turtledove

11

Sie können prüfen, ob es 2 Instanzen des Zeichens in der Zeichenkette:

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

(Ich einfach nur eines der Zeichen erfassen und prüfen, ob es eine Kopie an anderer Stelle mit Rückverweis hat. Der Rest von .* sind keine Sorgen).

Wenn der obige Ausdruck übereinstimmt, hat die Zeichenfolge ein sich wiederholendes Zeichen. Wenn die obige Regex nicht übereinstimmt, sind alle Zeichen eindeutig.

Die gute Sache über die Regex oben ist, wenn die Regex-Engine nicht umschauen unterstützt.

Scheinbar John Woo Lösung ist eine schöne Möglichkeit, um die Einzigartigkeit direkt zu überprüfen. Es gibt bei jedem Zeichen an, dass die Zeichenfolge ahead nicht das aktuelle Zeichen enthält.

+1

Einfach und effektiv. Noch einfacher zu sehen ohne die Anker: '(.). * \ 1' – pabo

0

Dies würde auch eine vollständige Übereinstimmung zu jeder Länge Wort mit nicht wiederholenden Buchstaben:

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

Ich habe die answer von @Bohemian vor einiger Zeit für eine andere Frage leicht überarbeitet, um th zu bekommen ist.

Es ist auch schon eine Weile her, seit die obige Frage gestellt wurde, aber ich dachte, es wäre schön, auch dieses Regex-Muster hier zu haben.

Verwandte Themen