Кажется, что в реализациях 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.
Мои лучшие усилия до сих пор приводят к этой реализации в 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
overlappling: true
иoverlapping: false
кажутся обратными? - person lurker   schedule 05.07.2018