Bug #4609
closedString#rpartition(regexp) has bug, when regexp contains quantifier
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) over 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) over 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