I took this a my afternoon code-quiz, so here is a solution if you want it: splitCamelCase | str split word| "Split an expanded camelcase word into constituents. Extened camel case allow some words to be fully uppercase" "'ZAPMeToo' splitCamelCase >>> #('ZAP' 'Me' 'Too')" str := ReadStream on: self. split := OrderedCollection new. word := WriteStream on: ''. [ str atEnd ] whileFalse: [ | char | char := str next. (char isUppercase and: [str atEnd or: [str peek isLowercase]]) ifTrue: [ split add: word contents. word := WriteStream on: '' ]. word nextPut: char ]. split add: word contents. ^ split asArray
You should then use cute join and asLowercase to go rest of the way. Best, Kasper > On 22 Oct 2022, at 14.53, Kasper Osterbye <kasper.oster...@gmail.com> wrote: > > My feeling is that it cannot be solved by regular expressions. The reason it > that there is the regular expressions in smalltalk/pharo does not have > look-ahead or backtracking. In your example the capital Y is part of MY, but > C starts a new word. I do not know of anyway to express that in smalltalk > regular expressions. > > So I believe this is one of the cases where you add an extension method to > string which does the job using plain coding. > > Best, > > Kasper > >> On 22 Oct 2022, at 10.56, Siemen Baader <siemenbaa...@gmail.com> wrote: >> >> Hi, >> >> I'm looking for an elegant way to convert class names with optional >> namespace prefixes to names for custom html elements. >> >> MYCustomElement and CustomElement >> >> to >> <my-custom-element> and <custom-element> >> >> There must be an elegant way to do it with regex or inject, but I'm >> embarrassed to say I can't get my head around it. I can get it to match the >> regex '((:isUppercase:+)*)((:isUppercase::isLowercase:+)*)', (if I recall >> correctly) but can't get a collection of the individual elements 'MY' >> 'Custom" 'Element' to lowercase and join. >> >> Thanks for any hints! >> >> cheers >> Siemen >