5 "こんにちは" =~ regex1 # => 5 但是使用这些正则表达式: reg-6ren">
gpt4 book ai didi

ruby - 多字节字符是否会干扰正则表达式中的结束行字符?

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

使用这个正则表达式:

regex1 = /\z/

以下字符串匹配:

"hello" =~ regex1 # => 5
"こんにちは" =~ regex1 # => 5

但是使用这些正则表达式:

regex2 = /#$/?\z/
regex3 = /\n?\z/

他们表现出不同:

"hello" =~ regex2 # => 5
"hello" =~ regex3 # => 5
"こんにちは" =~ regex2 # => nil
"こんにちは" =~ regex3 # => nil

什么是干扰?字符串编码为 UTF-8,操作系统为 Linux(即 $/"\n")。多字节字符是否会干扰 $/?怎么办?

最佳答案

你报告的问题肯定是Regexp的bug的 RUBY_VERSION #=> "2.0.0"但在以前的 1.9 中已经存在,当编码允许多字节字符时,例如 __ENCODING__ #=> #<Encoding:UTF-8>

不依赖于 Linux,也可以在 OSX 和 Windows 中重现相同的行为。

同时 bug 8210将被修复,我们可以通过隔离了解问题发生的情况来提供帮助。当适用于特定情况时,这对于任何解决方法也很有用。

我知道问题发生在:

  • 字符串结尾 之前搜索内容 \z .
  • 并且字符串的最后一个字符是多字节
  • 并且 before 搜索使用零或一个 模式?
  • 但搜索到的零个或一个字符数小于最后一个字符的字节数数。

该错误可能是由于正则表达式引擎实际检查的字节数和字符数之间存在误解造成的。

一些例子可能会有所帮助:

测试 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字符)之前。

当多字节字符不在字符串末尾时,我发现它可以正常工作。

public gist with my test code available here

关于ruby - 多字节字符是否会干扰正则表达式中的结束行字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15779859/

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