String visualworks smalltalk:如何从字符串中检测子字符串,可能吗?

String visualworks smalltalk:如何从字符串中检测子字符串,可能吗?,string,substring,smalltalk,visualworks,String,Substring,Smalltalk,Visualworks,正如标题所示,我不确定检测字符串中是否存在子字符串的最佳路径,例如: OverExtended:anErrorMessage "anErrorMessage = 'error: robot arm extended too far' " (anErrorMessage **contains:** 'extended too far') ifTrue:[ ... ... ] ifFalse:[ ... ... ]. 现在我知道上面的方法不起作用,但是有没有检查子字符串

正如标题所示,我不确定检测字符串中是否存在子字符串的最佳路径,例如:

OverExtended:anErrorMessage

"anErrorMessage = 'error: robot arm extended too far' "

(anErrorMessage **contains:** 'extended too far')
ifTrue:[
   ...
   ...
]
ifFalse:[
   ...
   ...
].

现在我知道上面的方法不起作用,但是有没有检查子字符串的现有方法???

这可能与方言有关,所以请尝试以下方法

'Smalltalk' includesSubstring: 'mall' --> true
'Smalltalk' includesSubstring: 'malta' --> true

'Smalltalk' indexOfSubCollection: 'mall' --> 2
'Smalltalk' indexOfSubCollection: 'malta' --> 0
见下面鲍勃的评论

'Smalltalk' indexOfSubCollection: 'mall' startingAt: 1 --> 2
'Smalltalk' indexOfSubCollection: 'malta' startingAt: 1 --> 0
您可能需要在图像中添加上述内容之一,例如:

String >> includesString: aString
  ^(self indexOfSubCollection: aString: startingAt: 1) > 0

这可能与方言有关,请尝试以下操作

'Smalltalk' includesSubstring: 'mall' --> true
'Smalltalk' includesSubstring: 'malta' --> true

'Smalltalk' indexOfSubCollection: 'mall' --> 2
'Smalltalk' indexOfSubCollection: 'malta' --> 0
见下面鲍勃的评论

'Smalltalk' indexOfSubCollection: 'mall' startingAt: 1 --> 2
'Smalltalk' indexOfSubCollection: 'malta' startingAt: 1 --> 0
您可能需要在图像中添加上述内容之一,例如:

String >> includesString: aString
  ^(self indexOfSubCollection: aString: startingAt: 1) > 0
试试match:,像这样:“*fox*”match:“树林里有一只狐狸”。有两种通配符:*和。匹配任何单个字符。*匹配任意数量的字符,包括“无”

match:默认为不区分大小写的匹配,如果需要区分大小写,请使用match:ignoringCase:并将false作为第二个参数传递。

尝试match:,例如:“*fox*”match:“森林里有一只狐狸”。有两种通配符:*和。匹配任何单个字符。*匹配任意数量的字符,包括“无”


match:默认为不区分大小写的匹配,如果需要区分大小写,请使用match:ignoringCase:并将false作为第二个参数传递。

match在VisualWorks中工作正常,但我为字符串添加了一个实用方法:

包括子字符串:aString

| readStream |
readStream := self readStream.
readStream upToAll: aString.
^readStream atEnd not

Match在VisualWorks中运行良好,但我向字符串添加了一个实用方法:

包括子字符串:aString

| readStream |
readStream := self readStream.
readStream upToAll: aString.
^readStream atEnd not

我已经找到了一个在所有场景中都简单而准确的答案,而不依赖于readStreams或“naitive”VW的扩展,最早可追溯到VW7.4:

只需使用findString:startingAt:并对发生次数进行大于零的检查

样本:

|string substring1 substring2|
string:= 'The Quick Brown Fox'.
substring1:= 'quick'.
substring2:='Quick'.

"below returns FALSE as 'quick' isnt found"
(string findString: substring1 startingAt:1)>0
ifTrue:[^'found [quick]'].

"below returns TRUE as 'Quick' is found"
(string findString: substring2 startingAt:1)>0
ifTrue:[^'found [Quick]'].

^'found nothing'.

我已经找到了一个在所有场景中都简单而准确的答案,而不依赖于readStreams或“naitive”VW的扩展,最早可追溯到VW7.4:

只需使用findString:startingAt:并对发生次数进行大于零的检查

样本:

|string substring1 substring2|
string:= 'The Quick Brown Fox'.
substring1:= 'quick'.
substring2:='Quick'.

"below returns FALSE as 'quick' isnt found"
(string findString: substring1 startingAt:1)>0
ifTrue:[^'found [quick]'].

"below returns TRUE as 'Quick' is found"
(string findString: substring2 startingAt:1)>0
ifTrue:[^'found [Quick]'].

^'found nothing'.

应该注意的是,输入文本可能是可变的,因此我不能简单地通过字符索引查看,即从18到:end等于“扩展得太远”,因为有些可能在尾端或前端包含更多内容。您也可以说您使用的是哪个版本。总是有帮助的。应该注意,输入文本可能是可变的,所以我不能简单地通过字符索引查看,即从18到:end等于“扩展得太远”,因为有些可能在尾端或前端包含更多内容。您还可以说您使用的是哪个版本。总是有用的。CharacterArray>>包括SubString:和SequenceableCollection>>indexOfSubCollection:都是扩展。但是CharacterArray>>indexOfSubCollection:startingAt:是基本的VW代码。大众真的应该在大众的基本代码中添加更多这样的实用方法。@BobNamec谢谢!如果在我的回答中添加您的评论。很好,但您可能是指自我索引…>0@aka.nice谢谢CharacterArray>>IncludeSubString:和SequenceableCollection>>indexOfSubCollection:都是扩展。但是CharacterArray>>indexOfSubCollection:startingAt:是基本的VW代码。大众真的应该在大众的基本代码中添加更多这样的实用方法。@BobNamec谢谢!如果在我的回答中添加您的评论。很好,但您可能是指自我索引…>0@aka.nice谢谢如果在接收器的末端出现收缩怎么办?readStream也将被定位为End。对吗?@LeandroCaniglia no,uptall:在下一次事件发生之前将流定位。你一定是在思考:哪一条河从下一条河流过occurrence@aka.nice我不知道它在大众汽车中是如何运作的,这就是我问的原因。在一些方言中,包括法罗语,厄普托尔语:在争论之后留下位置,如果它找到它的话。因此,如果是这种情况,并且参数发生在接收器的末尾,则流将定位为end,并且方法将失败。如果Uptall:在大众汽车中是不同的,那么上面的代码会像预期的那样工作。@LeandroCaniglia,嗯,你是对的,我以前从未注意到这种差异!在Squeak/Pharo/Cuis中,它会在事件发生后离开流。”tic tac toe“全部读取流:tac”;高端。->“toe”在大众汽车中是“tac toe”。在VW中,高达:$c将流定位在下一个字符$c之后,因此可能VW本身并不是这样的逻辑…如果在接收器的末尾出现aString呢?readStream也将被定位为End。对吗?@LeandroCaniglia no,uptall:在下一次事件发生之前将流定位。你一定是在思考:哪一条河从下一条河流过occurrence@aka.nice我不知道它在大众汽车中是如何运作的,这就是我问的原因。在一些方言中,包括法罗语,厄普托尔语:在争论之后留下位置,如果它找到它的话。因此,如果是这种情况,并且参数发生在接收器的末尾,则流将定位为end,并且方法将失败。如果Uptall:在VW中不同,则上述代码不适用于w
正如所料。@LeandroCaniglia,嗯,你说得对,我以前从未注意到这种差异!在Squeak/Pharo/Cuis中,它会在事件发生后离开流。”tic tac toe“全部读取流:tac”;高端。->“toe”在大众汽车中是“tac toe”。在VW中,高达:$c将流定位在下一个字符$c之后,因此可能VW本身并不是这样的逻辑。。。