Sử dụng Ruby 1.9.2, tôi đã mã của Ruby sau trong IRB:Tại sao tôi thấy các kết quả khác nhau cho hai mẫu regex Ruby gần như giống hệt nhau này, và tại sao một kết hợp những gì tôi nghĩ là không nên?
> r1 = /^(?=.*[\d])(?=.*[\W]).{8,20}$/i
> r2 = /^(?=.*\d)(?=.*\W).{8,20}$/i
> a = ["password", "1password", "password1", "pass1word", "password 1"]
> a.each {|p| puts "r1: #{r1.match(p) ? "+" : "-"} \"#{p}\"".ljust(25) + "r2: #{r2.match(p) ? "+" : "-"} \"#{p}\""}
Điều này dẫn đến kết quả như sau:
r1: - "password" r2: - "password"
r1: + "1password" r2: - "1password"
r1: + "password1" r2: - "password1"
r1: + "pass1word" r2: - "pass1word"
r1: + "password 1" r2: + "password 1"
1.) Tại sao kết quả khác nhau?
2.) Tại sao r1
khớp với chuỗi 2, 3 và 4? Chẳng phải cái nhìn của (?=.*[\W])
khiến nó thất bại vì không có bất kỳ ký tự không phải từ nào trong những ví dụ đó sao?
Bạn có thể thử khớp với '/^(? =. * [\ D]) (? =. * ([\ W])). {8,20} $/i' và cho biết sử dụng những gì được chụp trong nhóm chụp '1'? (Tôi sợ đó là chữ số, nhưng bạn không bao giờ biết) –
Kết quả sử dụng Ruby 1.9.3-p327: r1: - "mật khẩu" r2: - "mật khẩu" r1: - "1password" r2: - "1password" r1: - "password1" r2: - "password1" r1: - "pass1word" r2: - "pass1word" r1: + "mật khẩu 1" r2: + "mật khẩu 1" => ["mật khẩu", "1 mật khẩu "," password1 "," pass1word "," password 1 "] Có vẻ như bạn đã tìm thấy lỗi với 1.9.2? –
Bạn có thể đưa câu hỏi đó vào câu hỏi của bạn được không (vì mục đích định dạng thích hợp) –