Loop (解析字符串)


根据分隔符,从一个字符串中循环获取子字符串(片段),一次获取一段。

Loop, Parse, InputVar [, Delimiters, OmitChars]

参数

Parse 这个参数必须使用单词 PARSE ,而且和其它的循环命令不同,这里不能引用变量的值。
InputVar

需要被解析的变量。不要用百分号将变量名包起来,除非该变量的内容就是需要被解析的变量名。

Delimiters

分隔符。如果这个参数为空或省略,循环将依次获取 InputVar 中的每个字符。

如果这个参数使用 CSVInputVar 将按照标准的逗号分隔格式进行解析。这里有一个 MS Excel 生成的 CSV 文件的示例:"first field",SecondField,"the word ""special"" is quoted literally",,"last field, has literal comma"

其它情况下,Delimiters 中可以包含一个或多个字符(区分大小写),每一个字符都会作为分隔符,用来将 InputVar 中的字符串分隔为相应的子字符串。

分隔符将不会出现在被分隔出来子字符串中。另外,如果在 InputVar 中两个分隔符之间没有任何内容,则相应解析出来的子字符串为空。

例如:`, (经过转义的逗号) 会按照字符串中逗号的位置将字符串分隔为多个子字符串。相似的,%A_Tab%%A_Space% 则会按照字符串中空格和制表符的位置将字符串分隔。

如果需要使用一个字符串作为分隔符,可以先使用 StringReplace 命令将 InputVar 中相应的字符串替换为一个在 InputVar 中从未使用的字符,例如这些特殊字符:¢¤¥¦§©ª«®µ¶,然后再使用这些特殊字符作为分隔符进行解析。参考下面这个例子,使用字符串 <br> 作为分隔符:

StringReplace, NewHTML, HTMLString, <br>, ¢, All
Loop, parse, NewHTML, ¢ ; 使用 ¢ 解析字符串。
{
...
}
OmitChars

忽略字符。这个可选参数中可以包含一个或多个字符(区分大小写),这些字符会从解析出来的子字符串的开头和结尾部分移除。例如,OmitChars 参数使用 %A_Space%%A_Tab%,则如果解析出来的子字符串的开头或结尾部分有空格或制表符的话,这些空格和制表符会被删除(在子字符串中间的空格和制表符不会被删除)。

如果 Delimiters 参数留空,OmitChars 参数指定的字符将不会出现在循环中。

和其它大多数命令最后一个参数不同,在 OmitChars 参数中,逗号必须进行转义(`,)。

注意

当需要对一个字符串的各个片段进行逐个操作的时候,经常使用字符串解析循环。字符串解析循环也比 StringSplit 命令更省内存(因为 StringSplit 命令创建了一个持久的数组),而且在大多数情况下更加易用。

内置变量 A_LoopField 存在于任何一种解析循环中,它包含了从 InputVar 解析出来的当前子字符串(或片段)的内容。如果一个内部解析循环被装在一个外部解析循环中,则最里层循环中解析出来的片段将享有优先。

InputVar 或它的片段的大小没有限制。另外,即使在循环过程中 InputVar 的内容改变了,Loop 也会“无视”这些改变,因为它操作的是原始内容的临时副本。

要在解析之前将字符串中的片段进行排序,请用 Sort 命令。

请看 Loop 命令获取 Blocks, Break, Continue 以及内置变量 A_Index (存在于任何类型的循环中) 的相关信息。

相关命令

StringSplit, file-reading loop, Loop, Break, Continue, Blocks, Sort, FileSetAttrib, FileSetTime

示例

;示例 1:
Colors = red,green,blue
Loop, parse, Colors, `,
{
    MsgBox, 第 %A_Index% 种颜色是 %A_LoopField%。
}

 

;示例 2:逐行读取一个变量中的内容(类似文件读取循环)。
;使用 FileRead 命令可以将一个文件读取到一个变量中:
Loop, parse, FileContents, `n, `r  ;将 `n 写在 `r 前面以保证 Windows 和 Unix 这两者的文件都能被正常解析。
{
    MsgBox, 4, , 第 %A_Index% 行是 %A_LoopField%。`n`n继续?
    IfMsgBox, No, break
}

 

;示例 3:这个示例和上面的一样,只不过解析对象是剪贴板。
;当剪贴板中包含文件时很有用,例如从一个打开的资源管理器窗口中复制的文件(程序会自动将这些文件转换为它们完整的路径):
Loop, parse, clipboard, `n, `r
{
    MsgBox, 4, , 第 %A_Index% 个文件是 %A_LoopField%。`n`n继续?
    IfMsgBox, No, break
}

 

;示例 4:解析一个逗号分隔(CSV)格式的文件:
Loop, read, C:\Database Export.csv
{
    LineNumber = %A_Index%
    Loop, parse, A_LoopReadLine, CSV
    {
        MsgBox, 4, , 片段 %LineNumber%-%A_Index% 是:`n%A_LoopField%`n`n继续?
        IfMsgBox, No
            return
    }
}

翻译:okey3m   修正:天堂之门 menk33@163.com 2009年1月7日