# Loop (解析字符串)

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

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日