[基礎] AHK 中的字符串拼接和遍歷操作

字符串處理在多數編程語言中都是重頭戲,AHK 自然也不例外。AHK 在字符串處理方面還是很靈活的,如果掌握好了,寫起代碼來會事半功倍。本文先介紹最常用的操作:拼接和遍歷。

字符串拼接

拼接恐怕是最常用的操作了,在 AHK 中也非常簡單,直接將兩個字符串用空格隔開就可以了。

a := "abc"
b := 100
c := "def"
d := 123.456
e := 200

; f 的值是字符串 abc100anddef123.456
f := a b "and" c d
; g 的值是字符串 100200
g := b e

不管是字符串、整數還是浮點數,都可以用空格拼接成一個字符串。更神奇的是,空格可以和其他算術運算符一起使用。

a := 100
b := 200

; c 的值是 100150
c := a b - 50

其實 AHK 中整數 100200 和 字符串 "100200" 是沒有區別的,當整數用的時候就是 100200,當字符串用的時候就是 "100200",當然內部實現上會有一些優化。如果感覺無法接受的話,也可以認為整數和字符串是有區別的,在實際使用中會自動相互轉換。

實際上,AHK 中 .(點運算符)是專門用來拼接字符串的,在某些情況還是不能省略的。

a := 300
b := 200

; c 的值是 100
c := a - b

; d 的值是 300-200
d := a . - b

正因為空格可以和其他算術運算符一起使用,使用起來可以很靈活,為了避免歧義,空格只有在必要的情況(即這個表達式沒有其他的解釋辦法時)才起拼接作用。

子字符串遍歷

還有一個非常常見的操作,是遍歷一個字符串的子字符串。Loop, Parse 是專門用來做這個的。

Loop, Parse, InputVar [, Delimiters, OmitChars]

其中 InputVar 是變量名,不需要加 %。Delimiters 是分隔符,OmitChars 是要忽略的字符。

最簡單的場景就是遍歷字符串中的每一個字符。

text := "abcd"

Loop, Parse, text
{
    ; 依次彈出
    ; a
    ; b
    ; c
    ; d
    MsgBox, %A_LoopField%
}

Delimiters 和 OmitChars 都省略的情況,就是遍歷字符串中的每一個字符。

另外一個典型場景是依次處理一段文字的每一行。

text =
(
line1
line2
line3
)

Loop, Parse, text, `n, `r
{
    ; 依次彈出
    ; line1
    ; line2
    ; line3
    MsgBox, %A_LoopField%
}

這里 Delimiters 是 `n。`r 又是什么呢?在類 UNIX 操作系統中,文本中的換行符就是 `n,但在 Windows 中,換行符是 `r`n。如果處理一段換行符是 `r`n 的文本,直接用 `n 分隔,會保留多余的 `r,所以設置 OmitChars 為 `r 可以將其去掉??赡苡胁蛔屑毜呐笥颜J為 Loop, Parse, text, \n, `r是將字符串同時按 \n 和 `r 來分隔,這是錯誤的,`n 和 `r 的順序也不能顛倒。

除了按換行符,我們也經常需要按其他符號分隔字符串,比如按空格,按逗號等,就大同小異了。但需要注意空格和逗號有點特殊,因為它們是特殊符號,寫法有一些特別。

text := "a b,c d:xxx"

Loop, Parse, text, %A_Space%
{
    ; 依次彈出
    ; a
    ; b,c
    ; d:xxx
    MsgBox, %A_LoopField%
}

Loop, Parse, text, `,
{
    ; 依次彈出
    ; a b
    ; c d:xxx
    MsgBox, %A_LoopField%
}

Loop, Parse, text, :
{
    ; 依次彈出
    ; a b,c d
    ; xxx
    MsgBox, %A_LoopField%
}

這里空格用的是 %A_Space%,A_Space 是一個 AHK 的內部變量,這樣需要用 % 取該變量的值。`, 是用轉義的方法取到的逗號字符,因為直接寫逗號會被認為是參數的分隔符。類似的還有 `t 或者 %A_Tab% 是 Tab 等等,如果一個字符直接寫會報語法錯誤,那么通常在前邊加個 ` 就可以了。以后我也會專門寫文章介紹轉義字符。至于冒號,就沒有什么特別,直接寫就可以了。

有些情況我們需要按字符串分隔,而不是按字符分隔,比如:

text := "abc()bcd(cde"

需要按 () 分隔 text。需要注意,這種情況這樣的寫法就是錯誤的了:

text := "abc()bcd(cde"

Loop, Parse, text, (, )
{
    ; 依次彈出
    ; abc
    ; bcd
    ; cde
    MsgBox, %A_LoopField%
}

一個可行的辦法,是先將字符串中的 () 替換成一個字符串里沒有的特殊字符,比如 @,然后再用這個特殊字符作為分隔符:

text := "abc()bcd(cde"

; StrReplace 函數是用來替換字符串的,我們以后再詳細了解
text := StrReplace(text, "()", "@")

Loop, Parse, text, @
{
    ; 依次彈出
    ; abc
    ; bcd(cde
    MsgBox, %A_LoopField%
}

更多內容

除了拼接和遍歷字符串,我們還需要進行查找、替換、匹配、分隔、計算長度等操作,這涉及數量較多的字符串處理函數,以后我們再詳細了解。

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

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

推薦閱讀更多精彩內容