Bug #20083
closedString#match? behaving inconsistently with Ruby 3.3.0
Description
From irb, when calling String#match?
pattern = /([\s]*ABC)$/i # or /(\s*ABC)/i
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
With ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-darwin22]
and earlier versions (2.7.8 to 3.2.2) return value is always true
Update: the problem seems to be somehow related to the /i
option, as all the above examples work correctly with /([\s]*ABC)$/
Updated by jussikos (Jussi Koljonen) 11 months ago
- Subject changed from Regexp#match? behaving inconsistently with Ruby 3.3.0 to String#match? behaving inconsistently with Ruby 3.3.0
Updated by make_now_just (Hiroya Fujinami) 10 months ago
I created a PR for this bug (See https://github.com/ruby/ruby/pull/9367).
Thank you for your reporting!
The bug reason is a combination of a regex optimization and a bug for atomic groups.
First, since \s
and the following A
(internally it is treated as [aA]
on i
flag.) is mutually disjoint, \s*ABC
is optimized to (?>\s*)ABC
.
Next, match cache optimization for atomic groups in this case is buggy, so the matching results become wrong.
When i
flag is not given, another optimization is applied and \s*ABC
is optimized to (?:(?!A)\s)*ABC
, so the bug is not occurred.
Updated by naruse (Yui NARUSE) 10 months ago
- Backport changed from 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN to 3.0: DONTNEED, 3.1: DONTNEED, 3.2: DONTNEED, 3.3: REQUIRED
Updated by naruse (Yui NARUSE) 10 months ago
- Has duplicate Bug #20095: Regex lookahead behaving strangely in 3.3.0 added
Updated by naruse (Yui NARUSE) 9 months ago
- Backport changed from 3.0: DONTNEED, 3.1: DONTNEED, 3.2: DONTNEED, 3.3: REQUIRED to 3.0: DONTNEED, 3.1: DONTNEED, 3.2: DONTNEED, 3.3: DONE
ruby_3_3 5f3dfa1c273c6fb9eae65ceca633b46f7e30f686 merged revision(s) d8702ddbfbe8cc7fc601a9a4d19842ef9c2b76c1.