StringSplit / StrSplit()

AutoHotKey

StringSplit / StrSplit()

使用指定的分隔符把一个字符串分解成多个子字符串并保存到数组中.

StringSplit, OutputArray, InputVar [, Delimiters, OmitChars]
Array := StrSplit(String [, Delimiters, OmitChars])  ; [v1.1.13+]

参数

StringSplit

OutputArray

用来存储从 InputVar 分解出来的每个子字符串的伪数组名.例如, 如果指定 MyArray, 那么 MyArray0 中会保存分解出来的子字符串的数目 (没有则为 0), 首个子字符串为保存到 MyArray1, 第二个保存到 MyArray2 等.

函数中,要创建全局而不是局部的伪数组,必须先在函数中声明 MyArray0 为全局变量(对于假设全局函数,反之亦成). 但是, 通常需要对每一个元素进行定义, 否则可能引起 混乱的根源. 详见: Functions.

InputVar

需要被分解的变量名称. 不要把名称括在百分号中, 除非您希望使用变量的 内容 作为被解析的变量名. 注意:InputVar 不能是 OutputArray 中的其中一个变量.

分隔符

如果此参数为空或省略, 那么将把 InputVar 中的每个字符解析为单独的子字符串.

其他情况下, Delimiters 中可以包含一个或多个字符 (区分大小写), 其中的每个都被用来确定 InputVar 中子字符串之间的边界. 由于分隔符不被视为子字符串的一部分, 所以它们不会被保存到 OutputArray. 此外, 如果 InputVar 中一对分隔符之间不存在其他字符, 那么相应的数组元素会被置空.

例如:`,(转义的逗号)将根据逗号每次出现的位置分割字符串. 同样地,使用 %A_Tab%%A_Space% 作为分隔符将在 InputVar 中每次遇到空格或 tab 时创建一个新的数组元素.

要使用字符串而不是字符作为分隔符, 首先使用 StringReplace 把这个字符串在所有出现的地方替换为文本中从未使用的单个字符. 参考这个例子, 其中使用字符串 <br> 作为分隔符:

StringReplace, NewHTML, HTMLString, <br>, ``, All  ; 把所有 <br> 替换为重音符.
StringSplit, MyArray, NewHTML, ``  ; 使用重音符分隔字符串.

StrSplit() [v1.1.13+]

Array(数组)
(返回值)

字符串数组(对象).

String

要分割的字符串.

分隔符

如果此参数为空或省略,那么将把输入字符串中的每个字符解析为单独的子字符串.

其他情况下,Delimiters 中可以是单个字符串或字符串数组,其中的每个都被用来确定子字符串之间的边界. 由于分隔符不被视为子字符串的一部分,所以它们不会被包含在返回的数组中. 此外,如果输入字符串中一对分隔符之间没有其他字符,那么相应的数组元素会被置空.

例如:","将根据逗号每次出现的位置分割字符串. 同样地,使用 [A_Tab, A_Space] 作为分隔符将在输入字符串中每次遇到空格或 tab 时创建一个新的数组元素.

两者

OmitChars

可选的字符列表 (区分大小写), 用来从每个数组元素的开始和结尾部分移除这些字符. 例如如果在 OmitChars 中使用 %A_Space%%A_Tab%(StringSplit)或" `t"(StrSplit),那么每个元素中开始和结尾部分(但中间的不会)的空格和 tab 会被移除.

如果 Delimiters 为空, 那么 OmitChars 表示需要从数组中排除的那些字符.

与其他大多数命令的最后一个参数不同,在 StringSplit 参数 OmitChars 中的逗号必须进行转义(`,).

备注

如果数组元素已经存在,那么 StringSplit 命令只会改变其前面 N 个元素的值,此处 N 为在 InputVar 中的子字符串的数目. 原来存在的第 N 个元素之后的其他元素会保持不变. 因此, 最好使用零元素 (MyArray0) 来确定此命令实际分解出了多少项.

会保留例如空格和 tab 这样的空白字符,除非它们被作为分隔符或包含在 OmitChars 中. 调用 Trim 函数可以把空格和 tab 从每个变量的两端移除. 例如:MyArray1 := Trim(MyArray1).

要分割标准 CSV (逗号分隔值) 格式的字符串, 请使用 解析循环 内置的 CSV 处理功能.

要在分割前按不同的顺序排列字段, 请使用 Sort 命令.

如果您不需要把子字符串长时间的存储到内存中, 建议使用 解析循环, 尤其在 InputVar 非常巨大时可以节约大量内存. 例如:

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

相关

解析循环, Arrays, Sort, SplitPath, IfInString, StringGetPos, StringMid, StringTrimLeft, StringTrimRight, StringLen, StringLower, StringUpper, StringReplace

示例

TestString = This is a test.
StringSplit, word_array, TestString, %A_Space%, .  ; 移除句点.
MsgBox, The 4th word is %word_array4%.

Colors = red,green,blue
StringSplit, ColorArray, Colors, `,
Loop, %ColorArray0%
{
    this_color := ColorArray%a_index%
    MsgBox, Color number %a_index% is %this_color%.
}
TestString := "This is a test."
word_array := StrSplit(TestString, A_Space, ".")  ; 忽略句点. 
MsgBox % "The 4th word is " word_array[4]

Colors := "red,green,blue"
ColorArray := StrSplit(Colors, ",")
Loop % ColorArray.MaxIndex()
{
    this_color := ColorArray[a_index]
    MsgBox, Color number %a_index% is %this_color%.
}