Issue #4609 has been updated by Nobuyoshi Nakada.

Status changed from Open to Rejected

It's the way how regexp engines work.

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

----------------------------------------
Bug #4609: String#rpartition(regexp) has bug, when regexp contains quantifier
http://redmine.ruby-lang.org/issues/4609

Author: Joey Zhou
Status: Rejected
Priority: Normal
Assignee: 
Category: 
Target version: 
ruby -v: ruby 1.9.2p180 (2011-02-18) [i386-mingw32]


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.


-- 
http://redmine.ruby-lang.org