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#

SearchTextInputVar 中出现不止一次的时候,这个参数决定查找的方向。如果省略该参数,将从 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 中未能找到 SearchTextOutputVar 会被设置为 -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%
    }
}