字符串處理在多數(shù)編程語言中都是重頭戲吨些,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
不管是字符串、整數(shù)還是浮點數(shù)房蝉,都可以用空格拼接成一個字符串僚匆。更神奇的是,空格可以和其他算術運算符一起使用搭幻。
a := 100
b := 200
; c 的值是 100150
c := a b - 50
其實 AHK 中整數(shù) 100200 和 字符串 "100200" 是沒有區(qū)別的咧擂,當整數(shù)用的時候就是 100200,當字符串用的時候就是 "100200"粗卜,當然內(nèi)部實現(xiàn)上會有一些優(yōu)化屋确。如果感覺無法接受的話,也可以認為整數(shù)和字符串是有區(qū)別的续扔,在實際使用中會自動相互轉(zhuǎn)換攻臀。
實際上,AHK 中 .(點運算符)是專門用來拼接字符串的纱昧,在某些情況還是不能省略的刨啸。
a := 300
b := 200
; c 的值是 100
c := a - b
; d 的值是 300-200
d := a . - b
正因為空格可以和其他算術運算符一起使用,使用起來可以很靈活识脆,為了避免歧義设联,空格只有在必要的情況(即這個表達式?jīng)]有其他的解釋辦法時)才起拼接作用。
子字符串遍歷
還有一個非常常見的操作灼捂,是遍歷一個字符串的子字符串离例。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 操作系統(tǒng)中忿薇,文本中的換行符就是 `n裙椭,但在 Windows 中,換行符是 `r`n煌恢。如果處理一段換行符是 `r`n 的文本骇陈,直接用 `n 分隔,會保留多余的 `r瑰抵,所以設置 OmitChars 為 `r 可以將其去掉∑髁可能有不仔細的朋友認為 Loop, Parse, text, \
n, `r是將字符串同時按 \
n 和 `r 來分隔二汛,這是錯誤的,`n 和 `r 的順序也不能顛倒拨拓。
除了按換行符肴颊,我們也經(jīng)常需要按其他符號分隔字符串,比如按空格渣磷,按逗號等婿着,就大同小異了。但需要注意空格和逗號有點特殊醋界,因為它們是特殊符號竟宋,寫法有一些特別。
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 的內(nèi)部變量丘侠,這樣需要用 % 取該變量的值。`, 是用轉(zhuǎn)義的方法取到的逗號字符逐样,因為直接寫逗號會被認為是參數(shù)的分隔符蜗字。類似的還有 `t 或者 %A_Tab% 是 Tab 等等,如果一個字符直接寫會報語法錯誤脂新,那么通常在前邊加個 ` 就可以了挪捕。以后我也會專門寫文章介紹轉(zhuǎn)義字符。至于冒號争便,就沒有什么特別级零,直接寫就可以了。
有些情況我們需要按字符串分隔始花,而不是按字符分隔妄讯,比如:
text := "abc()bcd(cde"
需要按 () 分隔 text。需要注意酷宵,這種情況這樣的寫法就是錯誤的了:
text := "abc()bcd(cde"
Loop, Parse, text, (, )
{
; 依次彈出
; abc
; bcd
; cde
MsgBox, %A_LoopField%
}
一個可行的辦法亥贸,是先將字符串中的 () 替換成一個字符串里沒有的特殊字符,比如 @浇垦,然后再用這個特殊字符作為分隔符:
text := "abc()bcd(cde"
; StrReplace 函數(shù)是用來替換字符串的炕置,我們以后再詳細了解
text := StrReplace(text, "()", "@")
Loop, Parse, text, @
{
; 依次彈出
; abc
; bcd(cde
MsgBox, %A_LoopField%
}
更多內(nèi)容
除了拼接和遍歷字符串,我們還需要進行查找、替換朴摊、匹配默垄、分隔、計算長度等操作甚纲,這涉及數(shù)量較多的字符串處理函數(shù)口锭,以后我們再詳細了解。
付費解決 Windows介杆、Linux鹃操、Shell、C春哨、C++荆隘、AHK、Python赴背、JavaScript椰拒、Lua 等領域相關問題,靈活定價凰荚,歡迎咨詢燃观,微信 ly50247。