Project

General

Profile

Actions

Bug #4609

closed

String#rpartition(regexp) has bug, when regexp contains quantifier

Added by yimutang (Joey Zhou) almost 13 years ago. Updated almost 13 years ago.

Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
ruby 1.9.2p180 (2011-02-18) [i386-mingw32]
Backport:
[ruby-core:35874]

Description

=begin
For example:

str = "abc123def456ghi"
ary1 = str.partition(/\d+/)
ary2 = str.rpartition(/\d+/)
p ary1 #=> ["abc", "123", "def456ghi"]
p ary2 #=> ["abc123def45", "6", "ghi"]

What I expected is: ary2 is ["abc123def", "456", "ghi"].
["abc123def45", "6", "ghi"] may be the result of str.rpartition(/\d/)

I have no knowledge about C language, so I can't read the source code.
But I guess the matching procedure may be such:

Go from the right side of str, attempting to match the regexp:

matched_substr?

1 take "i" false go to next char

2 take "h" false go to next char

3 take "g" false go to next char

4 take "6" true("6") go to next char

5 add "5" true("56") go to next char

6 add "4" true("456") go to next char

7 add "f" false exit, return last matched string "456"

It seems that the actual procedure exit at step 4, whenever true, and return "6".

Maybe it should be a filp-flop condition, when matching become true, go ahead, exit when it becomes false again.
=end

Updated by yimutang (Joey Zhou) almost 13 years ago

=begin
Well, String#rindex act the same way:

str = "abc123def456ghi"
puts str.rindex(/\d+/) # 11, not 9
=end

Updated by nobu (Nobuyoshi Nakada) almost 13 years ago

  • Status changed from Open to Rejected

=begin
It's the way how regexp engines work.

Try:
"abc123def456ghi".rpartition(/(?<=\D|\A)\d+/)
or
"abc123def456ghi".partition(/\d+(?!.*\d)/)

=end

Actions

Also available in: Atom PDF

Like0
Like0Like0