问:
我知道可以使用 Split 命令将类似如下句子:VBScript is fun!分离为单个单词的数组。但是,如果我有类似如下的句子该怎么办呢:VBScript is fun!我不能使用空格作为分隔符,因为可能有很多空格。并且,我也不能使用特定数目的空格作为分隔符,因为空格的数目有可能不同。请问你们有什么建议?
-- SC
答:
嗨,SC。您可能很难相信,但我们这些 Scripting Guy 也是有标准的,至少对这个专栏来说是这样。我们每天都会收到很多问题,我们并不能对这些问题一一回答。那么,我们如何决定发表哪些问题呢?首先,我们会找一些看来比较容易回答的问题。以下是一个提示:如果您的问题包含很多并且——“并且我希望脚本能够这样,并且我希望脚本能够那样,并且……”——好吧,那这个问题出现在成堆问题的顶部的机会就可能比较小。我们知道这有点不公平,但无论如何,这个专栏只是我们日常工作的一小部分。因此我们不能在任何一个问题上花费太多时间。
我们寻求的另外一件事情会更有吸引力:我们的多数受众是否会对这个问题的回答感兴趣或是使用它。再说一次,这并不总是那么公平,但是“主流”技术的问题通常会比深奥技术的问题更受欢迎。非常抱歉。
老实说,尽管我们并不确定您的脚本属于哪一类,但我们决定回答这个问题,因为我们发现这个问题很有意思。毕竟,怎么能去除这些多于的空格,从而将 VBScript is fun! 变成 VBScript is fun! 呢? 以下就是我们提供的解决方案:
问题不在于字符串中有空格;如果是那样的话,我们就可以使用 VBScript 的 Replace 函数来去除所有空格了。但是,我们希望在字符串中留有一些空格;事实上,我们希望使每两个单词之间具有一个空格。我们只是要去除多余的空格。最后,我们决定使用 Replace 函数,将所有具有多个空格的实例替换为一个空格。因此,如果我们找到 7 个连续的空格,我们会将这些空格替换为一个空格。
非常简单,除了一个问题以外。Replace 函数需要有一个可供搜索的字符串,您不能这样告诉它:“好吧,请搜索具有多个空格的实例,并将它们替换为一个空格。”相反,您需要使用类似如下的代码,这段代码可将 7 替换为一个空格:
strStarter = Replace(strStarter, “ “, " ")
太好了,除了还不知道需要搜索几个空格以外;既然字符串中可能含有 7 个连续空格,那么其中也有可能含有 5 个连续空格。这怎么办呢?
我们使用以下脚本来处理这种情况。以下代码我们会在稍候解释:
strStarter = "VBScript is fun!"
intStarter = Len(strStarter)
For i = intStarter to 2 Step -1
strChars = Space(i)
strStarter = Replace(strStarter, strChars, " ")
Next
arrStarter = Split(strStarter, " ")
For Each strUnit in arrStarter
Wscript.Echo strUnit
Next
我们最后所做的就是说:“好吧,我们需要搜索由几个空格组成的字符串,但我们不知道每个字符串中可能包含几个空格。”这是有一点麻烦,直到我们发现,比如说吧,这个字符串总共有 37 个字符。这就是说字符串中最多可能有 37 个连续空格(假定这个字符串完全由空格组成)。因此,我们可以从搜索 37 个连续空格开始,如果找到了,那么我们就将它们替换为一个空格。然后,我们搜索 36 个连续空格,然后是 35 个,再然后是 34 个。我们一直这么搜索,直到最后搜索 2 个空格,并将这些空格都替换为一个空格。此时,我们就去除了所有多余的空格。
没什么新意,对吧?并且,令人惊奇的是,这种事情很容易做。注意在我们的脚本中,我们首先将某个字符串分配给变量 strStarter。然后我们使用以下代码来确定 strStarter 中有多少个字符:
intStarter = Len(strStarter)
我们还是假设其中有 37 个字符。我们需要做的就是从 37 开始一直循环到 2。猜一猜会发生什么呢?以下就是这个循环所做的:
For i = intStarter to 2 Step -1 strChars = Space(i) strStarter = Replace(strStarter, strChars, " ") Next
这个循环从字符串中的字符数开始执行,然后使用 Step -1 参数循环递减到 2。什么是 Step -1 呢?默认情况下,For Next 循环执行的时候每次递增 1。例如,以下循环从 1 开始执行,然后每次递增 1,直至循环到 10:
For i = 1 to 10
在我们的循环中,我们从最大数 (37) 开始,然后一直循环到 2,每次将 i 的值递减 1。明白了吧?这就是 Step -1 所做的;它实际上就是循环运行一次就减去 1。
在循环内部我们做两件事情。首先,我们需要创建一个由 i 个空格组成的字符串。幸好,我们可以使用一行代码做到这点,多亏有 Space 函数:
strChars = Space(i)
其次,我们需要检查 strStarter 是否可能存在由 i 个空格组成的子字符串。如果可能,则我们需要将它替换为一个空格。以下代码可实现这个目的:
strStarter = Replace(strStarter, strChars, " ")
从这里开始,我们继续执行循环,直到最后检查 2 个连续空格。然后我们退出循环,并使用 Split 命令将字符串划分为由单个单词组成的数组,然后——仅仅是为了证明上述过程有效——我们回显这些单词。
现在,这还不是十分保险;例如,如果您有一些多余的空格位于单词 VBScript 的前面呢?我们不再赘述这种情况,不过您可以使用 VBScript 的 Trim 和 RTrim 函数来去除起始空格和尾部空格。如果您希望了解有关字符串操作的更多信息,请参阅以下地址的相关部分:《Microsoft Windows 2000 脚本编写指南》中的相关部分.
我们也不知道类似于 VBScript is fun! 这样的字符串可能出现的环境。我们猜想您可能在尝试读取固定长度的日志文件时遇到这样的字符串。如果是这样,上述代码会有效,但您可能会发现使用ADO (ActiveX Database Objects) 来分析该文件会更简单。
----------------------
Space 函数
返回由指定数目的空格组成的字符串。
Space(number)
number 参数为字符串中用户所需的空格数。
说明
下面的示例利用 Space 函数返回由指定数目空格组成的字符串:
Dim MyString
MyString = Space(10) ' 返回具有 10 个空格的字符串。
MyString = "Hello" & Space(10) & "World" ' 在两个字符串之间插入 10 个空格。