gpt4 book ai didi

ruby - 为什么我会看到这两个几乎相同的 Ruby 正则表达式模式的不同结果,为什么一个匹配我认为不应该匹配的内容?

转载 作者:数据小太阳 更新时间:2023-10-29 07:06:13 24 4
gpt4 key购买 nike

使用 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]) 前瞻是否会导致它失败,因为这些示例中没有任何非单词字符?

最佳答案

这是由几个正则表达式功能和 Unicode 之间的相互作用产生的。 \W都是非单词字符,包括212A - "KELVIN SIGN" (PDF link)017F - "LATIN SMALL LETTER LONG S" ſ (PDF link) . /i 添加了这两者的小写版本,它们是“正常的”ks 字符(006B - "LATIN SMALL LETTER K" and 0073 "LATIN SMALL LETTER S" (PDF link))。

所以在某些情况下,password 中的 s 被解释为非单词字符。

请注意,这似乎只发生在 \W 属于字符类(即 [\W])时。此外,我只能在 irb 中重现它,在独立脚本中它似乎按预期工作。

参见 the Ruby bug about this获取更多信息。

关于ruby - 为什么我会看到这两个几乎相同的 Ruby 正则表达式模式的不同结果,为什么一个匹配我认为不应该匹配的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13573136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com