【发布时间】:2012-11-14 10:03:21
【问题描述】:
使用 Ruby 1.9.2,我在 IRB 中有以下 Ruby 代码:
> 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}\""}
这会产生以下输出:
r1: - "password" r2: - "password"
r1: + "1password" r2: - "1password"
r1: + "password1" r2: - "password1"
r1: + "pass1word" r2: - "pass1word"
r1: + "password 1" r2: + "password 1"
1.) 为什么结果不同?
2.) 为什么r1 会匹配字符串 2、3 和 4? (?=.*[\W]) 前瞻不会导致它失败,因为这些示例中没有任何非单词字符?
【问题讨论】:
-
您能否尝试匹配
/^(?=.*[\d])(?=.*([\W])).{8,20}$/i并告诉使用捕获组1中捕获的内容? (恐怕是数字,但你永远不知道) -
使用 Ruby 1.9.3-p327 的结果: r1: - "password" r2: - "password" r1: - "1password" r2: - "1password" r1: - "password1" r2: - "password1" r1: - "pass1word" r2: - "pass1word" r1: + "password 1" r2: + "password 1" => ["password", "1password", "password1", "pass1word", "password 1"] 看起来您可能发现了 1.9.2 的错误?
-
能否在您的问题中包含该问题(为了格式正确)
-
@ilanberci,我仍然在 1.9.3-p327 中看到相同的确切结果。 gist.github.com/a839ed2b3efdc949b894
标签: ruby regex unicode character-class