0

我是 SmallTalk 的新手,我正在使用 VisualWorks。我需要解析一个字符串并将每个字符插入一个不包括空格和所有标点符号的数组中。这不是家庭作业,而是一个大项目的一部分,我似乎无法弄清楚。请帮忙!

4

4 回答 4

2

对于更大的任务/更复杂的问题,请查看 PetitParser 和/或 SmaCC(都在公共商店中)。PetitParser 文档位于 Lukas Renggli 的网站上。

您可能会遇到的一些问题:

  • 你确定你需要一个数组,而不是一个字符串吗?
  • 您拥有和需要什么编码:8 位字符(哪个代码页)/UTF-8/UTF-16?
  • 如果你需要做很多,有更好的算法,例如使用表查找。随着被拒绝字符数的增加,接受的答案会变慢
于 2012-09-27T09:09:01.783 回答
1

可以这么简单(我用的是 VSE,但 VW 应该不会有太大的不同):

toThrowAway := #($  $. $, $: $; $! $?). "this contains all the characters that you want to throw away. Simply add anything else you don't want in the result"
(anArray := unparsed reject:[:c| toThrowAway includes: c]) asArray.

编辑(在您发表评论后):

正如我所写,我没有使用 Visual Works,也许它只是 asString 的不同实现。当您检查生成的数组或将其显示在工作区时,您会看到这种情况吗?结果数组的大小是多少?无论如何,您可以以更明确的方式尝试它:

toThrowAway := #($  $. $, $: $; $! $?). "this contains all the characters that you want to throw away. Simply add anything else you don't want in the result"
parsedString := unparsed reject:[:c| toThrowAway includes: c]).
anArray := Array new: parsedString size.
1 to: parsedString size do: [:i| anArray at: i put: (parsedString at:i)].
于 2012-09-25T14:45:17.363 回答
1

解析通常使用 Streams 来获取输入。从您的字符串中创建一个流并使用枚举

[stream atEnd] whileFalse: [
   char := stream next.
   ...
].

通过这种方式,您可以对大型输入集(例如从文件或套接字)进行操作,并保持您的内存消耗固定。

于 2017-02-12T19:06:35.813 回答
0

不考虑编码的因素,这里是一个简单的代码段。关键是您使用 OrderedCollection 收集所有字母字符,然后将其转换为数组(或您需要的其他集合)。

|aString aCol|
aString := 'abc def  $%^    g()h!'.
aCol := OrderedCollection new.
aString do:[:c|
    c isAlphabetic ifTrue:[
        aCol add:c
    ]

].
^aCol asArray
于 2017-01-20T07:24:32.643 回答