Visualworks Smalltalk: как я могу обнаружить подстроку из строки, это возможно? - PullRequest
1 голос
/ 21 апреля 2020

как следует из заголовка, я не уверен, что лучший способ обнаружить наличие подстроки в строке, например:

OverExtended:anErrorMessage

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

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

Теперь я знаю, что вышеприведенное не работает, но существует ли существующий метод для проверки подстрок ??

Ответы [ 4 ]

3 голосов
/ 21 апреля 2020

Это может зависеть от диалекта, поэтому попробуйте следующее

'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
2 голосов
/ 22 апреля 2020

Match отлично работает в VisualWorks, но я добавляю в строку служебный метод:

includesSubString: aString

| readStream |
readStream := self readStream.
readStream upToAll: aString.
^readStream atEnd not
1 голос
/ 24 апреля 2020

Я нашел ответ, который был бы простым и точным во всех сценариях ios без зависимости от readStreams или расширений для «наивного» VW еще в VW7.4:

просто используйте findString: начальный_т: и выполнить проверку больше чем ноль для числа случаев

пример:

|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'.
1 голос
/ 22 апреля 2020

попробуйте #match:, вот так: '*fox*' match: 'there''s a fox in the woods'. Существует два вида подстановочных знаков: * и #. # соответствует любому одному символу. * соответствует любому количеству символов (включая ни одного).

#match: по умолчанию сопоставление без учета регистра, если вам нужно регистр символов, используйте #match:ignoringCase: и передайте false в качестве второго аргумента.

...