[基礎] AHK 中的字符串處理函數

上一篇文章我介紹了AHK 中的字符串拼接和遍歷操作,但除此之外還有很多其他類型的字符串操作。本文會羅列 AHK 中多數用于字符串操作的函數,但也正因為此,我不會對每一個函數都詳細講解和舉例,大家可以直接去幫助文檔查詢感興趣的函數,里邊有詳細的講解和舉例。另外有一些高級內容,我只在文中提及,后續會專門寫文章來展開。

很多字符串處理函數還有對應的命令,比如 StrLen 函數對應 StringLen 命令。因為通常情況,函數比命令好用,有時功能還更強大,所以只介紹函數。但在性能上,命令通常要比函數好一些,如果遇到性能問題,可以自行查找幫助文檔,將函數替換成對應命令。

計算長度

StrLen 函數用于計算字符串的長度,這個我們在之前的判斷空字符串的文章提及過,所以并不陌生。

OutputVar := StrLen(InputVar)

需要注意的是,StrLen 的結果并非字符串所占用的字節數。如果字符串里包含中文、全角字符以及日文、韓文等非 ASCII 字符,長度也是只算 1 的,雖然實際儲存時并非只消耗 1 個字節。同時,StrLen 的結果也不能作為字符串的顯示長度,因為通常中文、全角字符等要比英文、半角字符的顯示寬度要大(如果是等寬字體,前者的寬度是后者的兩倍)。

StrLen 函數對應的命令是 StringLen。

查找

查找操作是指判斷一個字符串是否包含另一個字符串,如果包含,還需要找到具體的位置,這便是 InStr 函數的工作。

FoundPos := InStr(Haystack, Needle [, CaseSensitive = false, StartingPos = 1, Occurrence = 1])

InStr 函數的參數比較多。Haystack 是被查找的字符串,Needle 是待查找的字符串(即從 Haystack 里查找 Needle),CaseSensitive 用于設置是否區分大小寫,StartingPos 是開始查找的位置(從頭開始為 1,如果是 0 或者負數,將逆序查找),Occurrence 指查找幾次(比如 Occurrence 是 2,那么即使 Haystack 里有一個 Needle,也會因為沒有第 2 個 Needle 而返回 0)。

InStr 函數的返回值是 Needle 在 Haystack 的位置,從 1 開始。如果返回 0,說明沒找到。

和 InStr 函數有關的命令有 IfInString、IfNotInString、StringGetPos,如果遇到性能問題,可以使用。

另外 if 也可以用來判斷一個字符串中是否包含另一個字符串。可以在幫助文檔搜索 if var [not] in/contains 找到,里邊有詳細講解。我也會在以后專門介紹 if 判斷的文章里展開。

截取

截取操作是指取一個字符串的子字符串,這正是 SubStr 函數的工作。

NewStr := SubStr(String, StartPos [, Length])

SubStr 函數很好理解,String 即原始字符串。StartPos 為截取的起點,從 1 開始,如果為 0,表示截取最后一個字符;如果為 -1,表示截取最后兩個字符,以此類推。Length 為截取的長度,如果省略指截到原始字符串的末尾。

和 SubStr 函數有關的命令有 StringLeft、StringRight、StringMid、StringTrimLeft、StringTrimRight,這些命令用起來都不大方便,如果遇到性能問題,可以使用。

分隔

分隔字符串,和我們上一篇文章了解到的遍歷字符串很像,但 StrSplit 使用起來更靈活。

Array := StrSplit(String [, Delimiters, OmitChars])

String 是原始字符串,Delimiters 是分割符(和 Loop, Parse 不同,這里支持字符串,而且可以是一個字符串數組,非常強大),OmitChars 是移除和分隔符相鄰的特定字符。

返回的結果 Array 是一個數組,可以用 Array[1] 訪問第一個元素,用 Array.Length() 獲取數組中的元素個數等。以后我們會專門了解數組的用法。

StrSplit 函數對應的命令是 StringSplit,但二者在細節上有很多不同,如果因為性能等原因一定要用 StringSplit,要仔細測試。

替換

有時我們需要將字符串的特定內容替換成其他內容,StrReplace 函數就派上用場了。

OutputVar := StrReplace(Haystack, SearchText [, ReplaceText, OutputVarCount, Limit := -1])

StrReplace 函數參數比較多,但也很好理解。Haystack 是原始字符串,SearchText 是被替換的內容,ReplaceText 是替換成的內容(如果省略,代表直接刪除),OutputVarCount 用來存放替換的次數(如果省略代表不保存),Limit 指最多替換幾次(-1 指全部替換,如果為 1,代表只替換找到的第一個)。

StrReplace 函數對應的命令是 StringReplace。

判斷類型

判斷類型是指判斷一個字符串是否是整數、浮點數、字母、大寫字母、小寫字母、空白、時間等。

幫助文檔里講得很詳細,這里就不展開了,搜 if var is [not] type 即可。

這里舉個和下一節有關的判斷大小寫字母的例子:

a := "abc"
b := "ABC"
c := "abc1"

if a is lower
{
    ; 條件成立,只有字符串里全部是小寫字母(a-z)才成立
}

if b is upper
{
    ; 條件成立,同理
}

if c is lower
{
    ; 條件不成立,因為包含了一個數字
}

大小寫轉換

有時我們需要轉換字符串中字母的大小寫,StringLower 命令用于將大寫字母轉換成小寫,StringUpper 命令用于將小寫字母轉換成大寫。

StringLower, OutputVar, InputVar [, T]
StringUpper, OutputVar, InputVar [, T]

參數中的 OutputVar 和 InputVar 都是變量名,即不用加 %。T 參數表示將字符串轉換為標題格式,即每個單詞的首字母大寫,其余部分小寫。

移除首尾指定字符

有時我們需要移除一個字符串首尾的某些字符,典型情況就是移除首尾的空格。這就需要使用 Trim 系列函數。

Result := Trim(String, OmitChars = " `t")
Result := LTrim(String, OmitChars = " `t")
Result := RTrim(String, OmitChars = " `t")

這三個函數用法一致,Trim 用于移除字符串首尾(兩側)的指定字符,LTrim 用于移除字符串首部(左側)的指定字符,RTrim 用于移除字符串尾部(右側)的指定字符。

另外還有一個和此相關的命令。

AutoTrim, On|Off

AutoTrim 的含義是在用 = 賦值時是否自動移除首尾空白(空格和 Tab),默認是移除。

格式化

格式化操作主要是將整數、浮點數等格式化成特定格式的字符串,用來展示。這主要是 Format 函數的工作,SetFormat 命令也與此有關。Format 函數的參數很復雜,但幫助文檔里有詳細講解,暫時就不展開了,以后可能單獨講解。

排序

對字符串排序可以使用 Sort 命令,因為排序比較復雜,我以后再單獨講。

字符編碼操作

通常情況,我們不需要了解字符串對應的二進制數據是怎樣的。但有些時候我們需要知道字符對應編碼(比如 ASCII 編碼,或者 UTF-8 編碼),在字符與編碼間相互轉換等,Asc、Chr、Ord 函數用于此類操作。這其中涉及到一些復雜問題,先不展開,我以后會單獨講。

內存操作

通常情況,我們不需要關注字符串在內存是怎么儲存的,但某些場景我們需要這么做,比如轉編碼(此處編碼指代碼頁,比如將字符串從 UTF-8 轉成 CP936)。這就需要用到 StrPut 和 StrGet 函數。這屬于高級內容,也比較復雜,我以后會單獨講。

正則表達式

正則表達式也是用來查找和替換字符串用的,但自成體系,功能強大,也特別復雜。RegExMatch 函數、RegExReplace 函數和 ~= 運算符和正則表達式有關。因為 AHK 中的正則表達式和其他語言中的大同小異,而且關于正則表達式的內容特別多,暫時就不展開了,以后也會單獨講到。

付費解決 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等領域相關問題,靈活定價,歡迎咨詢,微信 ly50247。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容