根据分隔符,从一个字符串中循环获取子字符串(片段),一次获取一段。
Loop, Parse, InputVar [, Delimiters, OmitChars]
Parse | 这个参数必须使用单词 PARSE ,而且和其它的循环命令不同,这里不能引用变量的值。 |
InputVar | 需要被解析的变量。不要用百分号将变量名包起来,除非该变量的内容就是需要被解析的变量名。 |
Delimiters | 分隔符。如果这个参数为空或省略,循环将依次获取 InputVar 中的每个字符。 如果这个参数使用 CSV ,InputVar 将按照标准的逗号分隔格式进行解析。这里有一个 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日