Кажется, реализации Smalltalk пропускают алгоритм, который возвращает все индексы подстроки в строке. Наиболее похожие возвращают только один индекс элемента, например: firstIndexesOf: in:, findSubstring :, findAnySubstring: варианты.
Существуют реализации в Ruby , но первая основана на взломе Ruby, вторая не работает, игнорируя перекрывающиеся строки, а последняя использует класс Enumerator, который я не знаю, как перевести в Smalltalk. Интересно, лучше ли начинать эту реализацию Python , поскольку она рассматривает оба случая, перекрывающиеся или нет, и не использует регулярные выражения.
Моя цель - найти пакет или метод, который обеспечивает следующее поведение:
'ABDCDEFBDAC' indicesOf: 'BD'. "#(2 8)"
Когда рассматривается перекрытие:
'nnnn' indicesOf: 'nn' overlapping: true. "#(0 2)"
Когда перекрытие не учитывается:
'nnnn' indicesOf 'nn' overlapping: false. "#(0 1 2)"
В Pharo, когда текст выбран на игровой площадке, сканер обнаруживает подстроку и выделяет совпадения. Однако я не смог найти строковую реализацию этого.
Мои лучшие усилия на данный момент приводят к реализации в String (Pharo 6):
indicesOfSubstring: subString
| indices i |
indices := OrderedCollection new: self size.
i := 0.
[ (i := self findString: subString startingAt: i + 1) > 0 ] whileTrue: [
indices addLast: i ].
^ indices