📚
[Bug #20083] String#match? behaving inconsistently with Ruby 3.3.0
[Bug #20083] String#match? behaving inconsistently with Ruby 3.3.0
- 同様に Ruby 3.3.0 で正規表現がおかしいというバグ報告
- 以下のコードは Ruby 3.2.2 では全て
true
になるが Ruby 3.3.0 の場合はfalse
になるケースが存在している
# /i のときに再現する
pattern = /([\s]*ABC)$/i # or /(\s*ABC)/i
# Ruby 3.3.0 の実行結果
p "1ABC".match?(pattern) # => true
p "12ABC".match?(pattern) # => true
p "123ABC".match?(pattern) # => true
p "1231ABC".match?(pattern) # => true
p "12312ABC".match?(pattern) # => false
p "123123ABC".match?(pattern) # => false
p "1231231ABC".match?(pattern) # => true
p "12312312ABC".match?(pattern) # => true
p "123123123ABC".match?(pattern) # => false
p "1231231231ABC".match?(pattern) # => false
p "12312312312ABC".match?(pattern) # => true
p "123123123123ABC".match?(pattern) # => true
p "1231231231231ABC".match?(pattern) # => false
- バグの原因は
/\s*ABC/i
が内部では/(?>\s*)ABC/
に最適されるんですがこのときにアトミックグループにバグがあるらしくて、結果的におかしな結果になるらしいです - また
/\s*ABC/
のようにi
がない場合は/(?:(?!A)\s)*ABC/
に最適化され、この時はアトミックグループにはならないので問題ないらしい - この問題は開発版の Ruby では既に修正済み
Discussion