AHK 中的字串處理函式

2021-09-19 09:39:21 字數 3769 閱讀 6711

很多字串處理函式還有對應的命令,比如 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,這些命令用起來都不大方便,如果遇到效能問題,可以使用。

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

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 中的正規表示式和其他語言中的大同小異,而且關於正規表示式的內容特別多,暫時就不展開了,以後也會單獨講到。

SQL中字串處理函式

一 字元轉換函式 1 ascii 返回字元表示式最左端字元的ascii 碼值。在ascii 函式中,純數字的字串可不用 括起來,但含其它字元的字串必須用 括起來使用,否則會出錯。2 char 將ascii 碼轉換為字元。如果沒有輸入0 255 之間的ascii 碼值,char 返回null 3 lo...

php 中字串處理函式

1 查詢字元位置函式 strpos str,search,int 查詢search在 str中的第一次位置從int開始 stripos str,search,int 函式返回字串在另乙個字串中第一次出現的位置。該函式對大小寫不敏感 strrpos str,search,int 查詢search在 s...

makefile 中字串處理 函式

一 函式的呼叫語法 函式呼叫,很像變數的使用,也是以 來標識的,其語法如下 或是 這裡,就是函式名。是函式的引數,引數間以逗號 分隔,而函式名和引數之間以 空格 分隔。二 字串處理函式 subst 名稱 字串替換函式 subst。功能 把字串中的字串替換成new。返回 函式返回被替換過後的字串。示例...