2012-10-13 28 views

Trả lời

38

Hãy thử điều này, nó có thể làm việc,

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

Giải thích

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

Hoàn hảo, cảm ơn! – alfasin

+2

@JohnWoo Tôi tự hỏi bạn đã sử dụng công cụ nào để tạo ra lời giải thích? – turtledove

+0

@JohnWoo Cảm ơn, công cụ tuyệt vời! – turtledove

11

Bạn có thể kiểm tra xem có 2 trường hợp của ký tự trong chuỗi:

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

(Tôi chỉ đơn giản là chụp một trong những nhân vật và kiểm tra xem nó có một bản sao ở nơi khác với tham chiếu trở lại. Phần còn lại của .* là không quan tâm).

Nếu regex ở trên khớp, thì chuỗi có ký tự lặp lại. Nếu regex ở trên không khớp, thì tất cả các ký tự là duy nhất.

Điều tốt về regex ở trên là khi động cơ regex không hỗ trợ nhìn xung quanh.

Dường như giải pháp của John Woo là một cách hay để kiểm tra sự độc đáo trực tiếp. Nó khẳng định ở mọi ký tự mà chuỗi phía trước sẽ không chứa ký tự hiện tại.

+1

Đơn giản và hiệu quả. Thậm chí đơn giản hơn để xem mà không có các neo: '(.). * \ 1' – pabo

0

Cái này cũng sẽ cung cấp một kết hợp đầy đủ để bất kỳ từ nào dài với chữ không lặp lại:

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

Tôi đã sửa đổi một chút answer do @Bohemian cung cấp cho một câu hỏi khác trong khi trước đây để có được Là.

Nó cũng đã được một thời gian kể từ khi câu hỏi trên đã được hỏi nhưng tôi nghĩ nó sẽ là tốt đẹp để cũng có mẫu regex này ở đây.

Các vấn đề liên quan