Zsh 開發指南(四): 字串處理之萬用字元
導讀
這是字串處理系列的第三篇文章。前兩篇基本覆蓋了字串處理中的常用操作,但在字串匹配方面,沒有詳細展開。
萬用字元(glob)是 shell 中的一個比較重要的概念,可以認為是正規表示式的簡化版本。萬用字元在字串匹配和檔名搜尋等方面非常有用。本篇只講它在字串匹配上的用法。
萬用字元的基本用法
之前在講字串匹配判斷時,萬用字元出現過,就是 *"$str"*
兩邊的星號。
% str1=abcd
% str2=bc
# 星號要在引號外邊
% [[ "$str1" == *"$str2"* ]] && echo good
good
# 注意帶萬用字元的字串必須放在右邊
% [[ *"$str2"* == "$str1" ]] && echo good
星號是最常用的萬用字元,用於匹配任意數量(包括 0 個)的任意字元。
# 問號用於匹配一個任意字元
% [[ abcd == ab?? ]] && echo good
good
# 中括號用於匹配出現在其中的單個字元
% [[ abcd == abc[bcd] ]] && echo good
good
# 如果中括號裡第一個字元是 ^,則匹配除了除了中括號裡的單個字元
% [[ abcd == abc[^de] ]] && echo good
% [[ abcd == abc[^ce] ]] && echo good
good
# 中括號裡可以指定字元的範圍
% [[ a4 == [a-b][2-5] ]] && echo good
good
# 可以指定多個字元範圍,並且可以摻雜其他字元
% [[ B4 == [a-cdddA-B][2-5] ]] && echo good
good
# 尖括號用於匹配一定範圍的單個整數
% [[ 123 == 12<3-4> ]] && echo good
good
# 可以匹配整個整數
% [[ 123 == <100-200> ]] && echo good
good
# 可以沒有上下界,預設的下界是 0,上界是正無窮
% [[ 123 == <100-> && 123 == <-200> ]] && echo good
good
# 可以上下界都沒有,那麼會匹配任意正整數和 0
# 這個可以用來判斷字串是否構成整數
# [[ 123 == <-> ]] && echo good
good
# ( 1 | 2 | ... ) 用於同時判斷多個條件,滿足一個即可
% [[ ab == (aa|ab) ]] && echo good
good
# 如果中括號裡要用 - 或者 ^,放在最後即可,不需要轉義
% [[ -^3 == [a-c-][3^-][3^-] ]] && echo good
good
以上是萬用字元的基本用法,總結一下。
萬用字元 | 含義 |
---|---|
* | 任意數量的任意字元 |
? | 任意一個字元 |
[abcd] | abcd 中的任意一個字元 |
[abcd] | 除 abcd 外的任意一個字元 |
[a-c] | a 和 c 之間的一個字元 |
[a-cB-Dxyz] | a 和 c 之間、B 和 D 之間以及 xyz 中的一個字元 |
<1-100> | 1 和 100 之間的整數 |
<-50> | 0 和 50 之間的整數 |
<100-> | 大於 100 的整數 |
<-> | 任意正整數和 0 |
([a-c]\ | <1-100>) |
加強版萬用字元
Zsh 還支援加強版萬用字元,功能更多一些。如果使用加強版的萬用字元,需要先在程式碼里加上 setopt EXTENDED_GLOB
。
萬用字元 | 含義 | 匹配的樣例 |
---|---|---|
abc | 除了 abc 外的任意字串 | aaa |
abcabc | 以 abc 開頭,但後邊不是 abc 的字串 | abcabd |
a*c~abc | 符合 a*c 但不是 abc 的字串 | adc |
a# | 任意數量(包括 0)個 a | aaa |
b## | 一個或者多個 b | b |
(ab)## | 一個或者多個 ab | abab |
(#i)abc | 忽略大小寫的 abc | AbC |
(#i)ab(#I)c | 忽略大小寫的 ab 接著 c | ABc |
(#l)aBc | a 和 c 忽略大小寫,但 B 必須大寫 的 aBc | aBC |
(#a1)abc | 最多錯(多或缺也算)一個字元的 abc | a2c 或 ab 或 abcd |
此外還有一些更高階的用法,暫時先略過。
總結
字串的內容先告一段落,但之後的文章依然會不斷地涉及字串,因為陣列和雜湊表裡的內容通常是字串,處理目錄檔案時也涉及大量的字串操作等等,屆時會有新的字串處理方法。此外,如果我發現新的處理字串的方法或者技巧,也會更新這幾篇文章。
參考
相關文章
- Zsh 開發指南(第二篇 字串處理之常用操作)字串
- Zsh 開發指南(第三篇 字串處理之轉義字元和格式化輸出)字串字元
- JNI/NDK開發指南(4):字串處理字串
- 06.字元和字串處理字元字串
- Zsh 開發指南(五): 陣列陣列
- Kurento實戰之四:應用開發指南
- Java入門教程四(字串處理)Java字串
- Zsh 開發指南(第十二篇 [[ ]] 的用法)
- Zsh 開發指南(第五篇 陣列)陣列
- MySQL 之動態字串處理MySql字串
- Python3 - 用Shell萬用字元匹配字串Python字元字串
- 如何處理 MySQL 萬用字元的模糊查詢MySql字元
- Zsh 開發指南(第十三篇 管道和重定向)
- Zsh 開發指南(第十四篇 檔案讀寫)
- HarmonyOS NEXT應用開發之異常處理案例
- shell 字元處理字元
- 字串處理字串
- Zsh 開發指南(第十六篇 alias 和 eval 的用法)
- Zsh 開發指南(第七篇 數值計算)
- Zsh 開發指南(第十五篇 程式與作業控制)
- Flask開發技巧之異常處理Flask
- Linux系統學習之字元處理Linux字元
- OpenJudge 帶萬用字元的字串匹配字元字串匹配
- 批處理特殊符號 萬用字元與轉義符符號字元
- windows批處理之四:特殊的字串擷取及結合perl的操作Windows字串
- 如何識別字串中含有連續字元的處理辦法字串字元
- 字元處理函式字元函式
- tr命令“字元”處理字元
- Zsh 開發指南(第一篇 變數和語句)變數
- 實用處理字串的linux命令字串Linux
- 05 python開發之檔案處理Python
- SlimPHP開發指南四:Slim\AppPHPAPP
- Flink處理函式實戰之四:視窗處理函式
- awk 字串處理字串
- abap 字串處理字串
- Zsh 開發指南(第十一篇 變數的進階內容)變數
- windows批處理之一:字串處理Windows字串
- SQL特殊字元處理zzSQL字元