# StringGetPos

返回指定的子字符串在一个字符串中的位置。

StringGetPos, OutputVar, InputVar, SearchText [, L#|R#, Offset]
Position := InStr(Haystack, Needle [, CaseSensitive?, StartingPos]) ; 具体请查看 InStr() 函数 。

#### 参数

OutputVar | 存储子字符串在 InputVar 中的位置的变量名。在 StringGetPos 命令中，第一个字符的位置是 0 ，而在 InStr() 函数中第一个字符的位置是 1 。
InputVar | 需要被查找的字符串变量名。不要在变量名外加百分号，除非你想使用变量中的 内容 作为变量名。
SearchText | 查找的文本。不区分大小写，除非打开了 StringCaseSense 。
L#|R# | 当 SearchText 在 InputVar 中出现不止一次的时候，这个参数决定查找的方向。如果省略该参数，将从 InputVar 的左边开始查找，直到找到首个匹配的结果。如果该参数使用 1 或者 R ，将从 InputVar 的右边开始查找，直到找到首个匹配的结果。 要查找非首个匹配，在字母 L 或 R 后跟上相应的数字。例如，要从右边开始查找第四个匹配的结果，指定参数 r4 。注意：如果指定的数字小于或等于 0 ，不会找到匹配的结果。
Offset | 偏移。从左边或右边（取决于上面的参数）开始跳过多少个字符再开始查找。如果省略，默认是 0 。例如，下面的例子会从左边第十个字符开始查找：StringGetPos, OutputVar, InputVar, abc, , 9 。这个参数可以是一个 expression/表达式 。

#### ErrorLevel

当 InputVar 中未包含 SearchText 的时候 ErrorLevel/错误级别 被设置为 1 ，包含的时候设置为 0 。

#### 注意

与 StringMid 以及 InStr() 不同的是，在 StringGetPos 中第一个字符的位置是 0 。

返回的位置总是相对于 InputVar 的第一个字符的，而与是否使用 L#|R# 以及 Offset 参数无关。例如，字符串 “abc”在 123abc789 中的位置永远是 3 ，不管使用了什么参数。

如果在指定的条件下，在 InputVar 中未能找到 SearchText ，OutputVar 会被设置为 -1 ，ErrorLevel 会被设置为 1 。

使用 SplitPath 可以更容易将一个文件路径分解为目录，文件名，扩展名。

内置变量 %A_Space% 和 %A_Tab% 包含了一个单独的空格和一个单独的制表符。当你需要单独搜索空格或制表符，或者在 SearchText 的开头或结尾使用空格或制表符的时候会非常有用。

#### 相关命令

InStr(), RegExMatch(), IfInString, if var in/contains MatchList, StringCaseSense, StringReplace, SplitPath, StringLeft, StringRight, StringMid, StringTrimLeft, StringTrimRight, StringLen, StringLower, StringUpper, if var is type

示例

    Haystack = abcdefghijklmnopqrs
    Needle = def
    StringGetPos, pos, Haystack, %Needle%
    if pos >= 0
        MsgBox, The string was found at position %pos%.

    ; 示例 #2：
    ; 将一个完整的文件路径分解为各个组成部分。
    ; 注意，使用 StringSplit 或者
    ; parsing loop 会更加方便，这里只是举个例子。
    FileSelectFile, file, , , Pick a filename in a deeply nested folder:
    if file <>
    {
        StringLen, pos_prev, file
        pos_prev += 1 ; 调整位置到最后一个字符之后。
        Loop
        {
            ; 从右边开始查找第N个匹配
            StringGetPos, pos, file, \, R%A_Index%
            if ErrorLevel
                break
            length := pos_prev - pos - 1
            pos_prev := pos
            pos += 2  ; 为了使用StringMid进行调整。
            StringMid, path_component, file, %pos%, %length%
            MsgBox Path component #%a_index% (from the right) is:`n%path_component%
        }
    }