您报告的问题肯定是一个错误Regexp
of RUBY_VERSION #=> "2.0.0"
但在以前的 1.9 中已经存在,当时编码允许多字节字符,例如__ENCODING__ #=> #<Encoding:UTF-8>
不依赖于 Linux,也可以在 OSX 和 Windows 中重现相同的行为。
一会儿bug 8210 http://bugs.ruby-lang.org/issues/8210将被修复,我们可以提供帮助隔离 and 理解出现问题的情况。
这对于任何解决方法当适用于具体情况时。
据我了解,问题发生在以下情况:
- 之前搜索过一些东西字符串结尾
\z
.
- 字符串的最后一个字符是多字节.
- 和之前的搜索使用零或一图案
?
- 但数量零或一搜索的字符数少于bytes最后一个字符的。
该错误可能是由于正则表达式引擎实际检查的字节数和字符数之间的误解造成的。
一些例子可能会有所帮助:
测试 1:其中最后一个字符:“は”是 3 个字节:
s = "んにちは"
在字符串结尾之前测试 ん [3 个字节] 中的零个或一个:
s =~ /ん?\z/u #=> 4" # OK it works 3 == 3
当我们尝试使用 ç [2 个字节]
s =~ /ç?\z/u #=> nil # KO: BUG when 3 > 2
s =~ /x?ç?\z/u #=> 4 # OK it works 3 == ( 1+2 )
当测试 \n [1 个字节] 中的零个或一个时
s =~ /\n?\z/u #=> nil" # KO: BUG when 3 > 1
s =~ /\n?\n?\z/u #=> nil" # KO: BUG when 3 > 2
s =~ /\n?\n?\n?\z/u #=> 4" # OK it works 3 == ( 1+1+1)
根据 TEST1 的结果我们可以断言:如果字符串的最后一个多字节字符是 3 个字节,那么“之前的零个或一个”测试仅在我们之前测试至少 3 个字节(而不是 3 个字符)时才有效。
测试 2:最后一个字符在哪里"ç"是2个字节
s = "in French there is the ç"
检查 ん [3 字节] 中的零个或一个”
s =~ /ん?\z/u #=> 24 # OK 2 <= 3
检查 é [2 字节] 中是否有零个或一个
s =~ /é?\z/u #=> 24 # OK 2 == 2
s =~ /x?é?\z/u #=> 24 # OK 2 < (2+1)
测试 \n [1 个字节] 中的零个或一个
s =~ /\n?\z/u #=> nil # KO 2 > 1 ( the BUG occurs )
s =~ /\n?\n?\z/u #=> 24 # OK 2 == (1+1)
s =~ /\n?\n?\n?\z/u #=> 24 # OK 2 < (1+1+1)
根据 TEST2 的结果我们可以断言:如果字符串的最后一个多字节字符是 2 个字节,那么“之前的零个或一个”测试仅在我们检查之前至少有 2 个字节(而不是 2 个字符)时才有效。
当多字节字符不在字符串末尾时,我发现它可以正常工作。
公共要点与我的测试代码可用在这里 https://gist.github.com/anonymous/5339185