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])
先読みによって失敗しませんか?