</head> <body> <h1>Loop Parse</h1> <p>每次从字符串中检索字符串(片段).</p> <pre class="Syntax"><span class="func">Loop Parse</span> String <span class="optional">, DelimiterChars, OmitChars</span></pre> <h2 id="Parameters">参数</h2> <dl> <dt>String</dt> <dd> <p>类型: <a href="../Concepts.htm#strings">字符串</a></p> <p>要分析的字符串.</p> </dd> <dt>DelimiterChars</dt> <dd> <p>类型: <a href="../Concepts.htm#strings">字符串</a></p> <p>如果为空或省略, 那么将把输入字符串中的每个字符解析为单独的子字符串.</p> <p id="CSV">如果此参数为 <code>"CSV"</code>, 字符串将以标准的逗号分隔值格式进行解析. 下面是一个由 MS Excel 生成的 CSV 行的示例:</p> <pre class="no-highlight">"first field",SecondField,"the word ""special"" is quoted literally",,"last field, has literal comma"</pre> <p>否则, 请指定一个或多个字符(区分大小写), 每个字符用于确定子串之间的边界位置.</p> <p>分割字符不被认为是子串本身的一部分. 此外, 如果输入字符串中的一对分隔字符之间没有任何内容, 那么相应的子串将是空的.</p> <p>例如: <code>','</code>(逗号) 会根据每一个逗号的出现来划分字符串. 类似地, <code>A_Space A_Tab</code> 会在每次输入字符串中出现空格或制表符时开始一个新的子串.</p> <p>要使用字符串作为分隔字符而不是字符, 首先使用 <a href="StrReplace.htm">StrReplace</a> 将所有出现的字符串替换为从未在文本中使用过的单个字符, 例如, 这些特殊字符之一: <code>&cent;&curren;&yen;&brvbar;&sect;&copy;&ordf;&laquo;&reg;&micro;&para;</code>. 考虑这个示例, 它使用字符串 &lt;br&gt; 作为分隔符:</p> <pre>NewHTML := StrReplace(HTMLString, "&lt;br&gt;", "&cent;") Loop Parse, NewHTML, "&cent;" <em>; 使用 ¢ 解析字符串.</em> { <em>; ...</em> }</pre> </dd> <dt>OmitChars</dt> <dd> <p>类型: <a href="../Concepts.htm#strings">字符串</a></p> <p>如果为空或省略, 则不排除任何字符. 否则, 请指定一个字符列表(区分大小写), 用来从每个子字符串的开始和结尾部分移除这些字符. 例如, 如果 <em>OmitChars</em> 是 <code>A_Space A_Tab</code>, 那么每个解析出来的子字符串中开始和结尾部分(但中间的不会) 的空格和 tab 会被移除.</p> <p>如果 <em>DelimiterChars</em> 为空, 那么 <em>OmitChars</em> 表示应该考虑移除哪些字符(它们将不会出现在循环中).</p> </dd> </dl> <h2 id="Remarks">备注</h2> <p>当你想对一个字符串中包含的每一个片段进行操作时, 字符串解析循环很有用. 解析循环比 <a href="StrSplit.htm">StrSplit</a> 使用更少的内存且在大多数情况下更容易使用(尽管无论哪种方式使用的内存都是暂时的).</p> <p id="LoopField">内置变量 <strong>A_LoopField</strong> 存在于任何解析循环中. 它包含了当前子字符串(片段) 的内容. 如果一个内层解析循环包含在一个外层解析循环中, 则最内层循环的片段将具有优先权.</p> <p>尽管不存在内置变量 "A_LoopDelimiter", 不过在此页面最底部的例子演示了如何检测在分割每个片段时是由于遇到哪个分隔字符.</p> <p>输入字符串或其片段没有大小限制.</p> <p>要在解析前按不同的顺序排列字段, 请使用 <a href="Sort.htm">Sort</a> 函数.</p> <p>请参阅 <a href="Loop.htm">Loop</a> 了解关于<a href="Block.htm">区块</a>, <a href="Break.htm">Break</a>, <a href="Continue.htm">Continue</a> 和 A_Index 变量(其存在于各种类型的循环中) 的相关信息.</p> <p>循环的后面有一个可选的 <a href="Else.htm">Else</a> 语句, 如果循环的迭代次数为零, 则执行 Else 语句. 注意, 除非 <em>String</em> 为空或者省略了 <em>DelimiterChars</em> 并且 <em>String</em> 中的所有字符都包含在 <em>OmitChars</em> 中, 否则循环总是至少有一次迭代.</p> <h2 id="Related">相关</h2> <p><a href="StrSplit.htm">StrSplit</a>, <a href="LoopRead.htm">file-reading loop</a>, <a href="Loop.htm">Loop</a>, <a href="Break.htm">Break</a>, <a href="Continue.htm">Continue</a>, <a href="Block.htm">区块</a>, <a href="Sort.htm">Sort</a>, <a href="FileSetAttrib.htm">FileSetAttrib</a>, <a href="FileSetTime.htm">FileSetTime</a></p> <h2 id="Examples">示例</h2> <div class="ex" id="ExBasic"> <p><a class="ex_number" href="#ExBasic"></a> 解析一个逗号分隔的字符串.</p> <pre>Colors := "red,green,blue" Loop parse, Colors, "," { MsgBox "Color number " A_Index " is " A_LoopField }</pre> </div> <div class="ex" id="ExFileRead"> <p><a class="ex_number" href="#ExFileRead"></a> 按行读取变量的内容, 一行接一行(类似于 <a href="LoopRead.htm">file-reading 循环</a>). 文件可以通过 <a href="FileRead.htm">FileRead</a> 加载到变量中.</p> <pre>Loop parse, FileContents, "`n", "`r" <em>; 在 `r 之前指定 `n, 这样可以同时支持对 Windows 和 Unix 文件的解析.</em> { Result := MsgBox("Line number " A_Index " is " A_LoopField ".`n`nContinue?",, "y/n") } until Result = "No"</pre> </div> <div class="ex" id="ExClipboard"> <p><a class="ex_number" href="#ExClipboard"></a> 除了用于<a href="A_Clipboard.htm">剪贴板</a>外, 这个例子和上一个一样. 每当剪贴板包含文件时这个例子很有用, 例如从打开的资源管理器窗口复制的文件(程序自动把这些文件转换为它们的文件名).</p> <pre>Loop parse, A_Clipboard, "`n", "`r" { Result := MsgBox("File number " A_Index " is " A_LoopField ".`n`nContinue?",, "y/n") } until Result = "No"</pre> </div> <div class="ex" id="ExCSV"> <p><a class="ex_number" href="#ExCSV"></a> 解析逗号分隔值(CSV) 文件.</p> <pre>Loop read, "C:\Database Export.csv" { LineNumber := A_Index Loop parse, A_LoopReadLine, "CSV" { Result := MsgBox("Field " LineNumber "-" A_Index " is:`n" A_LoopField "`n`nContinue?",, "y/n") if Result = "No" return } }</pre> </div> <div class="ex" id="ExDelimiter"> <p><a class="ex_number" href="#ExDelimiter"></a> 判断遇到了哪个分隔字符.</p> <pre><em>; 初始化要搜索的字符串.</em> Colors := "red,green|blue;yellow|cyan,magenta" <em>; 初始化计数器来跟踪字符串中我们的位置.</em> Position := 0 Loop Parse, Colors, ",|;" { <em>; 计算在这个字段末尾分隔字符的位置.</em> Position += StrLen(A_LoopField) + 1 <em>; 获取解析循环中找到的分隔字符.</em> DelimiterChar := SubStr(Colors, Position, 1) MsgBox "Field: " A_LoopField "`nDelimiter character: " DelimiterChar }</pre> </div> </body> </html>