本文主要介紹筆者在做開源鴻蒙應(yīng)用開發(fā)時,ArkTs 中使用正則表達式處理像 string 等字符串對象。
主要內(nèi)容如下:
一些 ArkTs 使用正則表達式示例,以及一些可能比較常用的小技巧。
正則表達式的一些應(yīng)用技巧,涉及到匹配模式。
正則表達式在開源鴻蒙應(yīng)用開發(fā)中,可以起到怎樣的一個應(yīng)用。
黃同學(xué)最近在做 OpenHarmony 應(yīng)用開發(fā)的時候,遇到了一些場景,我需要從像 string 這樣的字符串?dāng)?shù)據(jù)中,獲取我需要的特定信息。
傳統(tǒng)的解決方式:相信我的讀者可能都有一些 DS 的基礎(chǔ),知道這種其實就是字符串匹配問題,針對這種問題,常見的解法是使用:暴力匹配、KMP、AC 自動機等方式,但是在實際應(yīng)用當(dāng)中如果這樣做,可能比較蠢。
我此前有過在 Python 中使用過具有正則表達(式)匹配功能的 re 模塊的經(jīng)歷。但是 ArkTs 并沒有類似的集成 API。
但是在 ArkTs 的相關(guān)文檔以及文章中,對這一塊的描述都比較少。從官方的描述來看,我們可以知道 ArkTs 是 TypeScript 和 JavaScript 的超集,兼容了JS/TS的語言生態(tài)。
所以我在寫這篇文章的時候,看了不少 JS 和 TS 關(guān)于正則表達式的使用的文檔。
MindMap:
正則表達式在ArkTs的使用
①變量 RegExp
在 ArkTs 中,正則表達式的變量類型是 RegExp,這一點基本上兼容了 JS。有兩種表達方式。
可以用斜杠來包住正則表達式,里邊就是正則表達式的內(nèi)容:
letrep:RegExp=/aS+b/;
也可以用 RegExp 的構(gòu)造函數(shù)來構(gòu)造,需要傳入 string 作為參數(shù):
letrep=newRegExp("aS+b");
②使用
正則表達式的變量使用較多,主要有:
match,這個是黃同學(xué)使用的最多的,在字符串中執(zhí)行查找匹配的 string 方法,會返回一個數(shù)組。
letrep:RegExp=/acfun1+/; lets:string="bkacfun1112"; console.log(s.match(rep)[0]);//acfun111test,在一個字符串中測試,判斷正則表達式是否能夠和字符串匹配。
letrep:RegExp=/acfun1+/; lets:string="bkacfun1112"; console.log(''+rep.test(string)?'yes':'no');//yes
match 查到的是一個第一個,但如果想匹配所有符合正則表達式的,可以使用 matchAll,這個返回的是一個迭代器,這個就不給出用例了,感興趣的朋友可以自行去 js 的相關(guān)文檔。
search,在字符串中查找匹配的位置(第一個),成功時返回匹配的位置,失敗返回 -1。
replace,即用字符串替換匹配到的字符子串。
③貪婪模式與懶惰模式
我在 ArkTs 中使用正則表達式做匹配的時候,發(fā)現(xiàn)和使用 Python 的 re 模塊有所不同。
在 Python 中,使用 re.match 的時候,會先匹配到最短滿足的字符串子串。而在 ArkTs 中,使用正則表達式和 match 的時候,會匹配到最長滿足的字符串子串。
上面的文字描述可能會比較抽象,下面用示例來表示:注釋中即為輸出內(nèi)容
Python:
importre s='sttstts' pat=re.compile(r's.*s') print(pat.match(pat).group(0))#sttsArkTs:
letrep:RegExp=/s.*s/ lets:string='sttstts' console.log(s.match(rep)[0])//sttstts
以上這兩種情況其實就是,在正則表達式的相關(guān)概念中,其實就是關(guān)于匹配模式中的貪婪模式與懶惰模式。
關(guān)于這兩種的詳細概念,如果朋友們想要了解,不妨去看看正則表達式的文檔。
我在這里將用比較簡單、淺顯的文字表述來解釋這兩種模式:這兩種模式,具體的運作其實就和名字一樣。
貪婪模式其實就是盡可能匹配比較長的字符串,如上面的例子 2 中的輸出,匹配過程很貪婪,和貪心算法思想類似,盡可能使匹配的結(jié)果長;而懶惰模式類似,就是匹配盡可能少的字符串,匹配到滿足的即可。
這兩種模式,其實就是為了讓開發(fā)者能更加靈活的使用正則表達式。這種兩種模式的區(qū)別主要體現(xiàn)在匹配多個字符的特殊正則表達式字符,比如正則表達式中+,*等。
④ArkTs 正則表達式懶惰模式
那么,如果你是 ArkTs 開發(fā)者,你要用懶惰模式,但是在 ArkTs 中,正則表達式默認是貪婪的。如何切換到懶惰模式呢?
這里和 Js 一樣,可以用 ? 來切換到懶惰模式,我們將上面的代碼修改后:
letrep:RegExp=/s.*?s/ lets:string='sttstts' console.log(s.match(rep)[0])//stts
上述的用 ? 后,就匹配最少的字符。
正則表達式應(yīng)用
相信通過上文的了解,我們已經(jīng)可以對正則表達式的已經(jīng)有了簡單的認知,尤其是通過這些使用的示例,很容易知道,從直接角度,正則表達式的應(yīng)用是對字符串這種類型的數(shù)據(jù)處理。這種處理是查詢匹配,替換。
通過上述的直接角度,我們可以對字符串?dāng)?shù)據(jù),即文本數(shù)據(jù),可以用于做字符串過濾,在很多有查找,替換功能的應(yīng)用(比如大家常用的編輯器 vscode,記事本),這些功能其實就有正則表達式影子。
ArkTs 應(yīng)用:網(wǎng)絡(luò)數(shù)據(jù)過濾
這個是我在編寫 OpenHarmony 應(yīng)用時,遇到的一個場景:使用@ohos.net.http 庫中相關(guān) api 向服務(wù)器發(fā)送 http 請求,會收到 http 報文。
這種報文并不只是數(shù)據(jù),還會有其他的部分。而我需要提取數(shù)據(jù)部分,且要分別提取出數(shù)據(jù)部分的某些字段。
因此,需要使用正則表達式來進行對網(wǎng)絡(luò)數(shù)據(jù)的過濾:
Code(ArKTs)
-
字符串
+關(guān)注
關(guān)注
1文章
579瀏覽量
20518 -
python
+關(guān)注
關(guān)注
56文章
4797瀏覽量
84690 -
正則表達式
+關(guān)注
關(guān)注
0文章
27瀏覽量
3496 -
鴻蒙
+關(guān)注
關(guān)注
57文章
2352瀏覽量
42859 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3722瀏覽量
16320
原文標(biāo)題:OpenHarmony中使用正則表達式
文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論