Squeak(smalltalk) subSrings 忽略字符串末尾的空字符串



>我正在尝试识别字符串末尾的换行符 使用子字符串。

问题:

check := 's
' subStrings: Character cr asString.
Transcript show: check size ; cr.
"prints: 1"
Transcript show: check ; cr.
"prints: #('s')"

我希望有 2 个字符串,因为我的校验字符串包含一个 cr 字符,子字符串返回 #('s''''(

当换行符存在于检查字符串中时

check := 's
'.
Transcript show: check size ; cr.
"prints: 2"

在 Squeak 中,有splitBy:.它在SequenceableCollection中定义。
虽然subStringsfindTokens:确实搜索一组分隔符中的任何一个,但splitBy:将分隔符视为要匹配的整个序列。
此外,这样的分隔符序列总是拆分左右子集合,可能是空的。

因此,您可以使用:

check := 's
' splitBy: String cr.

该方法的工作方式是一致的,我认为它与它的名称一致,因为String最后一个字符之后没有任何内容。

在 Pharo 和 Smalltalk 的其他方言中,您有"split:"方法,它在您的情况下可以满足您的需求:

Character cr split: 's
'

会用#('s' '')回答

您可能希望在以下行中添加(非常(简化版本的#split:到 Squeak

Character >> split: aString
| strings |
aString isEmpty ifTrue: [^Array new].
strings := aString subStrings: self asString.
aString last = self ifTrue: [strings := strings copyWith: ''].
^strings

请注意,我已经单独处理了空大小写,以便能够检查aString的最后一个字符。


补遗

在 @aka.nice 的回答之后,很明显,更好的#split:版本只是简化为

Character >> split: aString
^aString splitBy: self asString

此外,同样的想法可用于在其他类中实现#split:

最新更新