似乎 Smalltalk 实现错过了一种算法,该算法返回字符串中子字符串的所有索引。最相似的只返回一个元素的一个索引,例如:firstIndexesOf:in:、findSubstring:、findAnySubstring: variables。
Ruby 中有一些实现,但第一个依赖于 Ruby hack,第二个无法忽略重叠字符串,最后一个使用 Enumerator 类,我不知道如何将其转换为 Smalltalk。我想知道这个Python 实现是否是开始的最佳途径,因为考虑了两种情况,重叠与否,并且不使用正则表达式。
我的目标是找到一个提供以下行为的包或方法:
'ABDCDEFBDAC' indicesOf: 'BD'. "#(2 8)"
当考虑重叠时:
'nnnn' indicesOf: 'nn' overlapping: true. "#(0 2)"
当不考虑重叠时:
'nnnn' indicesOf 'nn' overlapping: false. "#(0 1 2)"
在 Pharo 中,当在 Playground 中选择文本时,扫描仪会检测子字符串并突出显示匹配项。但是我找不到这个的 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