Outro dia o Walter estava falando sobre um comportamento irregular da implementação de expressões regulares em Python, especificamente o token \b.Havia uma brincadeira em Ruby com regex que seleciona cada palavra em uma frase e embaralha a ordem das letras, mantendo a primeira e a última em seus lugares.
Para separar as palavras e os elementos de espaçamento entre elas, usava-se uma regex com
\b. Resolvi fazer a brincadeira em Smalltalk, mas descobri que o token também não funciona, portanto precisei fazer uma expressão que representasse cada bloco: ((\w+)|(\W+)).Para reproduzir essa brincadeira, usando Squeak, primeiro usando o System Browser crie um método
shaked na categoria copying da classe String:shaked
| aux fst i lst temp |
(self size <= 3) ifTrue: [ ↑ self copy ].
fst := (self byteAt: 1) asCharacter asString.
lst := (self byteAt: self size) asCharacter asString.
aux := self copyFrom: 2 to: self size - 1.
temp := Array new: aux size factorial.
i := 0.
aux permutationsDo: [ :s |
i := i + 1.
temp at: i put: (fst, s, lst).
].
↑ temp at: temp size atRandom.Agora, em um workspace, execute o seguinte código:
| phr |
" Esta é a frase a ser embaralhada "
phr := 'Kodumaro: as sombras da programação'.
Transcript open.
phr regex: '((\w+)|(\W+))' matchesDo: [ :s |
Transcript show: s shaked.
].
Transcript cr.Selecione tudo (M-a) e execute (M-d).
[]'s
Cacilhas, La Batalema
CC-BY: Os textos deste blog podem ser reporduzidos contanto que sejam informados autor e origem.