鉴于任何像'Lorem ipsum dolor sit amet,consectetuer adipiscing elit'这样的字符串,我想在坐下之前丢弃每个单词。我已经检查过String中的方法但是找不到这个方法非常有用。这是我的尝试:
| phrase newPhrase |
phrase := 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit'.
newPhrase := phrase substrings.
phrase substrings do: [: word | word = 'sit' ifFalse: [ newPhrase := newPhrase allButFirst ] ifTrue: [ ^ nil ] ].
newPhrase joinUsing: String space
在工作区中进行评估时它回答为nil,但是必须有一个聪明的方法吗?
答案 0 :(得分:6)
代码:
phrase substrings do: [: word | word = 'sit' ifFalse: [ ... ] ifTrue: [ ^ nil ] ].
找到单词 sit 后,返回 nil 。
请注意,Smalltalk中的 ^ 始终从封闭方法返回。它不会突破 do:
。
试试这个
在坐之前放弃所有单词:
words := phrase substrings.
newPhrase := words allButFirst: (words indexOf: 'sit') - 1
您可能还会发现这些收集方法很有趣:
words copyAfter: 'sit' "all words after sit"
words copyUpTo: 'sit' "all words before sit"
words copyUpThrough: 'sit' "words before and including sit"
答案 1 :(得分:4)
我会选择亚历山大的第一个答案:
words := phrase substrings.
newPhrase := words copyAfter: 'sit'
似乎有更多的意图揭示(即清楚)以下任何一种,但只是为了好玩,这里有另外两种方式:
如果在分析后,您想要更高的效率。这种方式的效率提高了25倍:
sitStart := phrase findWordStart: 'sit' startingAt: 1.
afterSit := sitStart + 4.
phrase copyFrom: afterSit to: phrase size.
PetitParser:效率低10倍,但是在更复杂的解析情况下,这是一个很好的工具:
sit := 'sit' asParser.
partToKeep := sit negate plus, sit, #any asParser plus flatten trim ==> [ :n | n third ].
partToKeep parse: phrase.
另外,如果找不到'sit',你必须决定该怎么做。