Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我在这两个几乎相同的Ruby正则表达式模式中看到不同的结果,为什么其中一个匹配我认为应该匹配的';T_Ruby_Regex_Unicode_Character Class - Fatal编程技术网

为什么我在这两个几乎相同的Ruby正则表达式模式中看到不同的结果,为什么其中一个匹配我认为应该匹配的';T

为什么我在这两个几乎相同的Ruby正则表达式模式中看到不同的结果,为什么其中一个匹配我认为应该匹配的';T,ruby,regex,unicode,character-class,Ruby,Regex,Unicode,Character Class,使用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}\""

使用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
是所有非单词字符,包括和。
/i
添加了这两个字符的小写版本,即“普通”
k
s
字符()

因此,在某些情况下,被解释为非单词字符的是
password
中的
s

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


有关更多信息,请参见。

您能否尝试匹配
/^(?=.[\d])(?=.*([\W])。{8,20}$/i
,并告诉用户捕获组
1
中捕获的内容?(恐怕是数字,但你永远不知道)使用Ruby 1.9.3-p327:r1:“密码”r2:“密码”r1:“1密码”r2:“1密码”r1:“密码1”r2:“密码1”r2:“密码1”r2:“密码1”r1:“密码1”r1:+“密码1”r2:+“密码1”=>[“密码”、“密码”、“密码”、“密码”、“密码1”、“密码1”,“password 1”]看起来您可能发现了1.9.2中的错误?请在您的问题中包括这一点(为了正确格式化)@ilanberci,我仍然在1.9.3-p327中看到相同的精确结果。抢手货这并不重要,但它不是
ß
(折叠为
ss
),而是017F-拉丁字母小写字母长S
ſ
(折叠为单个
S
)。@Pumbaa80谢谢,这更有意义,我更新了答案。我从你那里得到了
ß
。在这种情况下,
ß
也会匹配,因为
密码
中的双s,但实际匹配是单s,所以可能是
ſ
。哇,这是一个有趣的特性:)感谢您的解释和到错误报告的链接。因为我的正则表达式最终不需要区分大小写,只需关闭该标志,就会产生预期的行为。