Loop (문자열 파싱)

문자열로부터 서브스트링(필드)를 한 번에 하나씩 파싱합니다.

Loop, Parse, InputVar , Delimiters, OmitChars

매개변수

Parse

이 개변수는 단어 PARSE만 됩니다. 다른 회돌이 유형과 다르게, 변수 참조는 단어 PARSE로 결정된다고 할지라도 허용하지 않습니다.

InputVar

The name of the input variable whose contents will be analyzed. 이름을 퍼센트 사인으로 둘러 싸지 마십시오. 변수의 내용을 이름으로 사용하고 싶다면 예외입니다.

[v1.1.21+]: 이 매개변수는 % 표현식이 될 수 있지만, 퍼센트-스페이스 접두사가 반드시 사용되어야 합니다.

Delimiters

이 매개변수가 비어 있거나 생략되면, InputVar의 각 문자는 별도의 부문자열로 간주됩니다.

이 매개변수가 CSV이면, InputVar는 표준의 쉼표로 가른 값 형식으로 해석됩니다. 다음은 CSV줄의 예로서 MS Excel로 생산했습니다:

"first field",SecondField,"the word ""special"" is quoted literally",,"last field, has literal comma"

그렇지 않으면, Delimiters에는 하나 이상의 문자가 담깁니다 (대소문자 구별), 각 문자마다 InputVar에서 부문자열이 일어나는 경계를 결정합니다.

Delimiter 문자들은 부문자열 자체의 일부로 간주되지 않습니다. 또, InputVar 안에서 한 쌍의 구분자 사이에 아무것도 없다면, 상응하는 문자열은 비어 있습니다.

예를 들어: `, (피신된 쉼표)는 문자열을 쉼표가 출현할 때마다 가릅니다. 비슷하게, "%A_Tab%%A_Space%"는 InputVar에서 스페이스나 탭을 만날 때마다 새 문자열을 시작시킵니다.

To use a string as a delimiter rather than a character, first use StrReplace() or StringReplace to replace all occurrences of the string with a single character that is never used literally in the text, e.g. one of these special characters: ¢¤¥¦§©ª«®µ¶. 다음 예제를 연구해 보십시오. 문자열 <br>을 구분자로 사용합니다:

StringReplace, NewHTML, HTMLString, <br>, ¢, All
Loop, parse, NewHTML, ¢ ; 센트 심볼에 기반하여 문자열을 해석합니다.
{
...
}
OmitChars

각 부문자열의 선두와 후미에서 배제할 문자의 (선택적) 리스트 (대소문자 구분). 예를 들어, OmitChars가 %A_Space%%A_Tab%이면, 스페이스와 탭이 열람된 매 부문자열로부터 선두와 후미에서 제거됩니다 (가운데는 아님).

Delimiters가 비어 있으면, OmitChars는 고려 대상에서 배제할 문자들을 가리킵니다 (회돌이는 그런 문자들을 보지 못합니다).

대부분의 다른 명령어의 마지막 매개변수와 다르게, OmitChars에서 쉼표는 반드시 피신시켜야 합니다 (`,).

논평

문자열 파싱 회돌이는 문자열에 들어 있는 각 필드를 한 번에 하나씩 처리할 때 유용합니다. Parsing loops use less memory than StrSplit() or StringSplit (since it creates a permanent array or pseudo-array) and in most cases they are easier to use.

내장 변수 A_LoopField는 모든 파싱 회돌이 안에 존재합니다. 안에 InputVar로부터 파싱한 현재의 부문자열(필드)가 들어 있습니다. 내부 파싱 회돌이가 바깥 파싱 회돌이로 둘러 싸여 있다면 내부 회돌이의 필드가 우선 순위가 높습니다.

내장 변수 "A_LoopDelimiter"는 전혀 없지만, 이 페이지 맨 아래 예제는 각 필드마다 어느 구분자를 사용하고 있는 보여줍니다.

InputVar의 크기 또는 그의 필드의 크기에는 제한이 없습니다. 게다가, InputVar의 내용이 회돌이를 실행하는 동안에 바뀐다면, 그 회돌이는 그 변화를 "보지 못합니다". 왜냐하면 원래 내용의 임시 사본을 처리하고 있기 때문입니다.

해석하기 전에 필드를 다른 순서로 정돈하려면, Sort 명령어를 사용하십시오.

Blocks, Break, Continue, 그리고 A_Index 변수 (모든 유형의 회돌이에 존재함)에 관한 정보는 Loop를 참조하십시오.

StrSplit(), 파일-읽기 회돌이, Loop, Break, Continue, 블록, Sort, FileSetAttrib, FileSetTime, StringSplit

예제

Parses a comma-separated string.

Colors := "red,green,blue"
Loop, parse, Colors, `,
{
    MsgBox, Color number %A_Index% is %A_LoopField%.
}

변수 안에 줄들을 하나씩 읽어 들입니다 (파일-읽기 회돌이와 유사). FileRead를 통하여 파일을 변수 안에 적재할 수 있습니다.

Loop, parse, FileContents, `n, `r  ; `n을 먼저 `r을 다음에 지정해야 Windows와 Unix 파일을 모두 해석할 수 있습니다.
{
    MsgBox, 4, , Line number %A_Index% is %A_LoopField%.`n`nContinue?
    IfMsgBox, No, break
}

위의 예제와 같지만 클립보드용입니다. 클립보드에 파일이 담겨 있을 때 유용합니다. 그런 파일은 보통 탐색창으로부터 복사됩니다 (프로그램은 자동으로 그런 파일을 그들의 파일 이름으로 변환합니다).

Loop, parse, clipboard, `n, `r
{
    MsgBox, 4, , File number %A_Index% is %A_LoopField%.`n`nContinue?
    IfMsgBox, No, break
}

쉼표로 가른 값 (CSV) 파일을 해석합니다.

Loop, read, C:\Database Export.csv
{
    LineNumber := A_Index
    Loop, parse, A_LoopReadLine, CSV
    {
        MsgBox, 4, , Field %LineNumber%-%A_Index% is:`n%A_LoopField%`n`nContinue?
        IfMsgBox, No
            return
    }
}

어느 구분자에 마주했는지 알아내기.

; 검색할 문자열을 초기화 합니다.
Colors := "red,green|blue;yellow|cyan,magenta"
; 문자열에서 위치를 추적할 계수를 초기화합니다.
Position := 0

Loop, Parse, Colors, `,|;
{
    ; 이 필드의 끝에서 구분자의 위치를 계산합니다.
    Position += StrLen(A_LoopField) + 1
    ; 해석 회돌이가 발견한 구분자를 열람합니다.
    Delimiter := SubStr(Colors, Position, 1)

    MsgBox Field: %A_LoopField%`nDelimiter: %Delimiter%
}