Reputation: 15756
In Smalltalk, if given the string 'OneTwoThree', I'd like to remove the last 'Three' part, .e., In Squeak method finder notation: 'OneTwoThree' . 'Three' . 'OneTwo'
.
The best I can come up with is:
'OneTwoThree' allButLast: 'Three' size
,
but it doesn't feel very Smalltalk-ish, because it uses the substring length, rather than the substring itself. How would you code it?
Upvotes: 8
Views: 1906
Reputation: 27793
In the Moose project, there should be a method #removeSuffix:
that removes a given suffix, if present.
Upvotes: 2
Reputation: 156
If you need everything after only the last occurence removed:
|original cutOut lastEnd currentEnd modified|
original := 'OneTwoThree'.
cutOut := 'Three'.
lastEnd := 0.
[currentEnd := lastEnd.
lastEnd := original indexOf: cutOut startingAt: lastEnd +1.
lastEnd = 0
] whileFalse.
modified := currentStart > 0 ifTrue: [original first: currentEnd] ifFalse: [original copy]
Upvotes: 1
Reputation: 3964
I usually use #copyReplaceAll:with: method, if the last string is not repeated elsewhere in the original string of course:
'OneTwoThree' copyReplaceAll: 'Three' with: ''
Upvotes: 6