上一篇文章我介紹了AHK 中的字符串拼接和遍歷操作辫秧,但除此之外還有很多其他類型的字符串操作轰豆。本文會(huì)羅列 AHK 中多數(shù)用于字符串操作的函數(shù)赴叹,但也正因?yàn)榇瞬霍妫也粫?huì)對(duì)每一個(gè)函數(shù)都詳細(xì)講解和舉例兵扬,大家可以直接去幫助文檔查詢感興趣的函數(shù),里邊有詳細(xì)的講解和舉例口蝠。另外有一些高級(jí)內(nèi)容器钟,我只在文中提及,后續(xù)會(huì)專門(mén)寫(xiě)文章來(lái)展開(kāi)妙蔗。
很多字符串處理函數(shù)還有對(duì)應(yīng)的命令傲霸,比如 StrLen 函數(shù)對(duì)應(yīng) StringLen 命令。因?yàn)橥ǔG闆r眉反,函數(shù)比命令好用昙啄,有時(shí)功能還更強(qiáng)大,所以只介紹函數(shù)禁漓。但在性能上跟衅,命令通常要比函數(shù)好一些,如果遇到性能問(wèn)題播歼,可以自行查找?guī)椭臋n,將函數(shù)替換成對(duì)應(yīng)命令掰读。
計(jì)算長(zhǎng)度
StrLen 函數(shù)用于計(jì)算字符串的長(zhǎng)度秘狞,這個(gè)我們?cè)谥暗呐袛嗫兆址奈恼绿峒斑^(guò),所以并不陌生蹈集。
OutputVar := StrLen(InputVar)
需要注意的是烁试,StrLen 的結(jié)果并非字符串所占用的字節(jié)數(shù)。如果字符串里包含中文拢肆、全角字符以及日文减响、韓文等非 ASCII 字符,長(zhǎng)度也是只算 1 的郭怪,雖然實(shí)際儲(chǔ)存時(shí)并非只消耗 1 個(gè)字節(jié)支示。同時(shí),StrLen 的結(jié)果也不能作為字符串的顯示長(zhǎng)度鄙才,因?yàn)橥ǔV形乃毯琛⑷亲址纫扔⑽摹虢亲址娘@示寬度要大(如果是等寬字體攒庵,前者的寬度是后者的兩倍)嘴纺。
StrLen 函數(shù)對(duì)應(yīng)的命令是 StringLen败晴。
查找
查找操作是指判斷一個(gè)字符串是否包含另一個(gè)字符串,如果包含栽渴,還需要找到具體的位置尖坤,這便是 InStr 函數(shù)的工作。
FoundPos := InStr(Haystack, Needle [, CaseSensitive = false, StartingPos = 1, Occurrence = 1])
InStr 函數(shù)的參數(shù)比較多闲擦。Haystack 是被查找的字符串慢味,Needle 是待查找的字符串(即從 Haystack 里查找 Needle),CaseSensitive 用于設(shè)置是否區(qū)分大小寫(xiě)佛致,StartingPos 是開(kāi)始查找的位置(從頭開(kāi)始為 1贮缕,如果是 0 或者負(fù)數(shù),將逆序查找)俺榆,Occurrence 指查找?guī)状危ū热?Occurrence 是 2感昼,那么即使 Haystack 里有一個(gè) Needle,也會(huì)因?yàn)闆](méi)有第 2 個(gè) Needle 而返回 0)罐脊。
InStr 函數(shù)的返回值是 Needle 在 Haystack 的位置定嗓,從 1 開(kāi)始。如果返回 0萍桌,說(shuō)明沒(méi)找到宵溅。
和 InStr 函數(shù)有關(guān)的命令有 IfInString、IfNotInString上炎、StringGetPos恃逻,如果遇到性能問(wèn)題,可以使用藕施。
另外 if 也可以用來(lái)判斷一個(gè)字符串中是否包含另一個(gè)字符串寇损。可以在幫助文檔搜索 if var [not] in/contains 找到裳食,里邊有詳細(xì)講解矛市。我也會(huì)在以后專門(mén)介紹 if 判斷的文章里展開(kāi)。
截取
截取操作是指取一個(gè)字符串的子字符串诲祸,這正是 SubStr 函數(shù)的工作浊吏。
NewStr := SubStr(String, StartPos [, Length])
SubStr 函數(shù)很好理解,String 即原始字符串救氯。StartPos 為截取的起點(diǎn)找田,從 1 開(kāi)始,如果為 0径密,表示截取最后一個(gè)字符午阵;如果為 -1,表示截取最后兩個(gè)字符,以此類推底桂。Length 為截取的長(zhǎng)度植袍,如果省略指截到原始字符串的末尾。
和 SubStr 函數(shù)有關(guān)的命令有 StringLeft籽懦、StringRight于个、StringMid、StringTrimLeft暮顺、StringTrimRight厅篓,這些命令用起來(lái)都不大方便,如果遇到性能問(wèn)題捶码,可以使用羽氮。
分隔
分隔字符串,和我們上一篇文章了解到的遍歷字符串很像惫恼,但 StrSplit 使用起來(lái)更靈活档押。
Array := StrSplit(String [, Delimiters, OmitChars])
String 是原始字符串,Delimiters 是分割符(和 Loop, Parse 不同祈纯,這里支持字符串令宿,而且可以是一個(gè)字符串?dāng)?shù)組,非常強(qiáng)大)腕窥,OmitChars 是移除和分隔符相鄰的特定字符粒没。
返回的結(jié)果 Array 是一個(gè)數(shù)組,可以用 Array[1] 訪問(wèn)第一個(gè)元素簇爆,用 Array.Length() 獲取數(shù)組中的元素個(gè)數(shù)等癞松。以后我們會(huì)專門(mén)了解數(shù)組的用法。
StrSplit 函數(shù)對(duì)應(yīng)的命令是 StringSplit入蛆,但二者在細(xì)節(jié)上有很多不同拦惋,如果因?yàn)樾阅艿仍蛞欢ㄒ?StringSplit,要仔細(xì)測(cè)試安寺。
替換
有時(shí)我們需要將字符串的特定內(nèi)容替換成其他內(nèi)容,StrReplace 函數(shù)就派上用場(chǎng)了首尼。
OutputVar := StrReplace(Haystack, SearchText [, ReplaceText, OutputVarCount, Limit := -1])
StrReplace 函數(shù)參數(shù)比較多挑庶,但也很好理解。Haystack 是原始字符串软能,SearchText 是被替換的內(nèi)容迎捺,ReplaceText 是替換成的內(nèi)容(如果省略,代表直接刪除)查排,OutputVarCount 用來(lái)存放替換的次數(shù)(如果省略代表不保存)凳枝,Limit 指最多替換幾次(-1 指全部替換,如果為 1,代表只替換找到的第一個(gè))岖瑰。
StrReplace 函數(shù)對(duì)應(yīng)的命令是 StringReplace叛买。
判斷類型
判斷類型是指判斷一個(gè)字符串是否是整數(shù)、浮點(diǎn)數(shù)蹋订、字母率挣、大寫(xiě)字母、小寫(xiě)字母露戒、空白椒功、時(shí)間等。
幫助文檔里講得很詳細(xì)智什,這里就不展開(kāi)了动漾,搜 if var is [not] type 即可。
這里舉個(gè)和下一節(jié)有關(guān)的判斷大小寫(xiě)字母的例子:
a := "abc"
b := "ABC"
c := "abc1"
if a is lower
{
; 條件成立荠锭,只有字符串里全部是小寫(xiě)字母(a-z)才成立
}
if b is upper
{
; 條件成立旱眯,同理
}
if c is lower
{
; 條件不成立,因?yàn)榘艘粋€(gè)數(shù)字
}
大小寫(xiě)轉(zhuǎn)換
有時(shí)我們需要轉(zhuǎn)換字符串中字母的大小寫(xiě)节沦,StringLower 命令用于將大寫(xiě)字母轉(zhuǎn)換成小寫(xiě)键思,StringUpper 命令用于將小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)。
StringLower, OutputVar, InputVar [, T]
StringUpper, OutputVar, InputVar [, T]
參數(shù)中的 OutputVar 和 InputVar 都是變量名甫贯,即不用加 %吼鳞。T 參數(shù)表示將字符串轉(zhuǎn)換為標(biāo)題格式,即每個(gè)單詞的首字母大寫(xiě)叫搁,其余部分小寫(xiě)赔桌。
移除首尾指定字符
有時(shí)我們需要移除一個(gè)字符串首尾的某些字符,典型情況就是移除首尾的空格渴逻。這就需要使用 Trim 系列函數(shù)疾党。
Result := Trim(String, OmitChars = " `t")
Result := LTrim(String, OmitChars = " `t")
Result := RTrim(String, OmitChars = " `t")
這三個(gè)函數(shù)用法一致,Trim 用于移除字符串首尾(兩側(cè))的指定字符惨奕,LTrim 用于移除字符串首部(左側(cè))的指定字符雪位,RTrim 用于移除字符串尾部(右側(cè))的指定字符。
另外還有一個(gè)和此相關(guān)的命令梨撞。
AutoTrim, On|Off
AutoTrim 的含義是在用 = 賦值時(shí)是否自動(dòng)移除首尾空白(空格和 Tab)雹洗,默認(rèn)是移除。
格式化
格式化操作主要是將整數(shù)卧波、浮點(diǎn)數(shù)等格式化成特定格式的字符串时肿,用來(lái)展示。這主要是 Format 函數(shù)的工作港粱,SetFormat 命令也與此有關(guān)螃成。Format 函數(shù)的參數(shù)很復(fù)雜,但幫助文檔里有詳細(xì)講解,暫時(shí)就不展開(kāi)了寸宏,以后可能單獨(dú)講解宁炫。
排序
對(duì)字符串排序可以使用 Sort 命令,因?yàn)榕判虮容^復(fù)雜击吱,我以后再單獨(dú)講淋淀。
字符編碼操作
通常情況,我們不需要了解字符串對(duì)應(yīng)的二進(jìn)制數(shù)據(jù)是怎樣的覆醇。但有些時(shí)候我們需要知道字符對(duì)應(yīng)編碼(比如 ASCII 編碼朵纷,或者 UTF-8 編碼),在字符與編碼間相互轉(zhuǎn)換等永脓,Asc袍辞、Chr、Ord 函數(shù)用于此類操作常摧。這其中涉及到一些復(fù)雜問(wèn)題搅吁,先不展開(kāi),我以后會(huì)單獨(dú)講落午。
內(nèi)存操作
通常情況谎懦,我們不需要關(guān)注字符串在內(nèi)存是怎么儲(chǔ)存的,但某些場(chǎng)景我們需要這么做溃斋,比如轉(zhuǎn)編碼(此處編碼指代碼頁(yè)界拦,比如將字符串從 UTF-8 轉(zhuǎn)成 CP936)。這就需要用到 StrPut 和 StrGet 函數(shù)梗劫。這屬于高級(jí)內(nèi)容享甸,也比較復(fù)雜,我以后會(huì)單獨(dú)講梳侨。
正則表達(dá)式
正則表達(dá)式也是用來(lái)查找和替換字符串用的蛉威,但自成體系,功能強(qiáng)大走哺,也特別復(fù)雜蚯嫌。RegExMatch 函數(shù)、RegExReplace 函數(shù)和 ~= 運(yùn)算符和正則表達(dá)式有關(guān)丙躏。因?yàn)?AHK 中的正則表達(dá)式和其他語(yǔ)言中的大同小異齐帚,而且關(guān)于正則表達(dá)式的內(nèi)容特別多,暫時(shí)就不展開(kāi)了彼哼,以后也會(huì)單獨(dú)講到。
付費(fèi)解決 Windows湘今、Linux敢朱、Shell、C、C++拴签、AHK孝常、Python、JavaScript蚓哩、Lua 等領(lǐng)域相關(guān)問(wèn)題构灸,靈活定價(jià),歡迎咨詢岸梨,微信 ly50247喜颁。