[基礎(chǔ)] AHK 中的字符串處理函數(shù)

上一篇文章我介紹了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喜颁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市曹阔,隨后出現(xiàn)的幾起案子半开,更是在濱河造成了極大的恐慌,老刑警劉巖赃份,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寂拆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡抓韩,警方通過(guò)查閱死者的電腦和手機(jī)纠永,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谒拴,“玉大人尝江,你說(shuō)我怎么就攤上這事”胙Γ” “怎么了茂装?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)善延。 經(jīng)常有香客問(wèn)我少态,道長(zhǎng),這世上最難降的妖魔是什么易遣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任彼妻,我火速辦了婚禮,結(jié)果婚禮上豆茫,老公的妹妹穿的比我還像新娘侨歉。我一直安慰自己,他們只是感情好揩魂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布幽邓。 她就那樣靜靜地躺著,像睡著了一般火脉。 火紅的嫁衣襯著肌膚如雪牵舵。 梳的紋絲不亂的頭發(fā)上柒啤,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音畸颅,去河邊找鬼担巩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛没炒,可吹牛的內(nèi)容都是我干的涛癌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼送火,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拳话!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起漾脂,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤假颇,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后骨稿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體笨鸡,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年坦冠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了形耗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辙浑,死狀恐怖激涤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情判呕,我是刑警寧澤倦踢,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站侠草,受9級(jí)特大地震影響辱挥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜边涕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一晤碘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧功蜓,春花似錦园爷、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至著隆,卻和暖如春叠洗,著一層夾襖步出監(jiān)牢的瞬間甘改,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工灭抑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抵代。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓腾节,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親荤牍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子案腺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容