⚡ 站長快讀:核心重點
- 文章屬性:教學實戰(跨工具通用技能)
- 適用系統:Windows、macOS、Linux 皆適用(工具指令略有差異)
- 難易度 / 耗時:⭐⭐ / 約 20 分鐘
- 核心結論:正規表示式(regex)是一套用符號描述「文字長什麼樣」的通用語法,學一次就能在 grep、PowerShell、編輯器裡重複使用,拿來找檔案、抓資料、批次改文字最省時。
- 適用對象:常要在一堆檔案或文字裡找東西、改東西,又不想一個一個手動處理的人
📌 快速答案
一句話答案:正規表示式是一套用符號描述文字規則的語法,搭配 grep、PowerShell Select-String 或編輯器搜尋列,就能在大量檔案與文字中精準比對、擷取與批次取代,不必再逐行手動處理。
🧰 開始前的準備
- 適用環境:Windows(PowerShell / VS Code / Notepad++)、macOS 與 Linux(終端機 grep、sed);本文範例以跨平台通用寫法為主
- 權限需求:一般使用者即可;只有「批次改檔名 / 取代」動到實體檔案時才需要留意備份
- 需要工具:任一支援 regex 的工具就好——命令列的 grep、PowerShell 的 Select-String,或編輯器 VS Code / Notepad++ 的搜尋列
- 預計耗時:約 20 分鐘看懂常用符號,再跟著跑幾個實戰場景
- 難度門檻:看得懂「用一個符號代表一整類字元」就能開始,不需要會寫程式
🔍 為什麼你需要這個?
你有沒有這種經驗:資料夾裡幾百個檔名格式不一的照片要改名、一份幾千行的紀錄檔要挑出所有錯誤、或是想把文件裡的日期格式全部統一——結果只能一個一個手動改,改到眼睛脫窗還怕漏掉?這正是正規表示式要解決的事。它不是某個軟體的功能,而是一套「描述文字規則」的通用語法:你先用符號寫出「我要找的東西長什麼樣子」,工具就會把符合規則的全部揪出來,一次比對、擷取,甚至批次取代。
最划算的地方在於它是「學一次、到處用」。同一套概念,在 Linux 終端機的 grep、Windows 的 PowerShell Select-String、VS Code 的搜尋列、甚至 Excel 以外幾乎所有能搜尋的地方都通用。花 20 分鐘把常用符號看懂,往後每次找檔案、清資料都能省下大把時間。
🛠️ 實戰步驟
步驟一:先看懂最常用的符號
正規表示式的核心,是用「特殊符號(metacharacter)」代表「一整類字元」或「重複幾次」。先把下面這張表記個大概,不用背,看得懂就好:
| 符號 | 意思 | 範例 | 會比對到 |
|---|---|---|---|
. | 任意一個字元 | a.c | abc、a9c、a-c |
\d | 一個數字(0–9) | \d\d | 07、26 |
\w | 一個字元(英數或底線) | \w+ | Report_01 |
\s | 一個空白 | a\sb | 「a b」 |
[abc] | 中括號內任一個 | [ap]ng | ang、png |
^ $ | 行首、行尾 | ^ERROR | 以 ERROR 開頭的行 |
* + ? | 前一項出現 0+、1+、0 或 1 次 | ab+ | ab、abbb |
{n,m} | 前一項出現 n 到 m 次 | \d{2,4} | 26、2026 |
| | 或(擇一) | png|jpg | png 或 jpg |
( ) | 群組(可被擷取) | (19|20)\d\d | 2026 |
\ | 跳脫(取消特殊意義) | \. | 真正的點「.」 |
📋 重點摘要
- 記三類就夠開始:代表字元的(
.\d\w[ ])、代表次數的(*+?{n,m})、代表位置的(^$)。 - 想找「真正的點、星號」這種符號本身,前面加
\跳脫,例如\.才是真的句點。 ( )群組先眼熟就好,步驟四批次取代時它是主角。
步驟二:用 grep 在檔案裡「找內容」
先從最經典的 grep 上手。以下範例可在 macOS / Linux 終端機直接重現(本文於 GNU grep 3.7 環境實際執行、輸出如下),Windows 使用者可在 WSL 或 Git Bash 得到相同結果。假設有個 contacts.txt 混著姓名、email 與電話,要把所有 email 抓出來:
grep -Eo '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' contacts.txt實際輸出:
ming@example.com
meihua@company.com.tw
support@shop.io
datong@mail.co拆解這條規則:[a-zA-Z0-9._%+-]+ 是「一串帳號允許的字元」,@ 是字面上的小老鼠,[a-zA-Z0-9.-]+ 是網域,\.[a-zA-Z]{2,} 是「一個點加上至少兩個字母」的結尾。幾個常用參數要記:
-E:使用延伸語法,+?{}|()才會生效(GNU grep 預設是舊版 BRE,這些要跳脫,加-E最省事)。-o:只印出「比對到的那一段」,而不是整行——抓資料超好用。-i:忽略大小寫。
步驟三:找出「哪個檔案裡有」某個字
除了抓內容,regex 更常見的用途是「在一堆檔案裡,找出哪幾個檔含有某字串」。這招在翻程式碼、找設定檔時每天都用得到:
grep -rln 'ERROR' .-r 遞迴往子資料夾找、-l 只印「檔名」不印內容、-n 需要時可加上行號。想找檔名本身符合規則的檔案(而不是內容),則交給 find(Linux/macOS)或 Everything 這類檔名搜尋工具處理,它們同樣支援用 regex 比對檔名,秒搜整台電腦(文末延伸閱讀有專文)。
步驟四:Windows 這邊怎麼用——Select-String 與 findstr 的陷阱
Windows 沒有內建 grep,但 PowerShell 的 Select-String 就是同一路數。依微軟官方文件,Select-String 的 -Pattern 預設就是當作正規表示式處理;若只想找純文字、不要它把符號當語法,才加 -SimpleMatch。例如挑出紀錄檔裡的錯誤行:
Select-String -Path .\log.txt -Pattern 'ERROR|WARN'⚠️ 站長踩雷提醒:很多人會改用 CMD 的
findstr,然後把網路上抄來的 regex 貼進去,結果「明明沒錯卻找不到」。原因是findstr /R的正規表示式是非標準的閹割版——依微軟官方文件,它不支援|(或)、\d(數字類)、+與{n,m}(重複次數)。所以ERROR|WARN在 findstr 完全無效(它會把|當成一般文字)。要嘛改用 PowerShell 的Select-String,要嘛遷就 findstr 的規則(它用「空格」當 OR)。這是 Windows 上最常見的 regex 翻車點。
步驟五:批次改文字與改檔名(群組 + 反向參照)
regex 真正的省時魔法在「取代」。這裡登場的是步驟一提過的 ( ) 群組:用括號把要保留的片段框起來,取代時用 \1、\2(或編輯器裡的 $1、$2)把它們「搬回來」重新排列。這叫反向參照(backreference)。
例如要把 2026-07-05 這種日期,全部改成 2026/07/05,用 sed:
sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\1\/\2\/\3/' log.txt三組括號分別擷取年、月、日,取代字串 \1/\2/\3 再把它們用斜線重組。實測一行輸入 2026-07-05 18:04:02 會變成 2026/07/05 18:04:02,完全不用手動改。
批次改檔名同理。用 Python 的 re 模組,可以把一批檔名的副檔名統一小寫、空白換底線:
import re
new = re.sub(r'\s+', '_', name) # 空白換底線
new = re.sub(r'\.(JPG|PNG)$', lambda m: m.group(0).lower(), new)站長之前的〈Python 自動化第一課:批次改檔名〉就是用這套邏輯整理資料夾。如果不想寫程式,微軟 PowerToys 的 PowerRename 提供圖形介面,一樣支援 regex 與群組取代,適合怕終端機的人。
⚠️ 動實體檔案前務必先預覽:批次取代與改檔名一旦跑錯,可能一次改壞幾百個檔。sed 先不加任何寫回參數、只看螢幕輸出;PowerRename 有即時預覽欄;寫程式則先用
步驟六:在編輯器裡用 regex 搜尋取代(最適合非工程師)
其實最好上手的,是你天天在用的編輯器。VS Code 的搜尋框有一顆 .* 按鈕(快捷鍵 Alt + R),按下去就切換成正規表示式模式;取代欄一樣用 $1、$2 帶回群組。Notepad++ 的「取代」對話框裡也有「規則運算式」選項。對不想碰命令列的人來說,這是把 regex 用起來最快的方式:一邊改一邊看到高亮,錯了馬上發現。
🔬 為什麼同一條 regex 換個工具就失靈?
如果你踩過「這條規則在 A 工具能跑,貼到 B 工具就壞掉」的雷,那不是你寫錯,而是撞到了 regex 的方言(flavor)問題。正規表示式不是單一標準,而是一整個家族:
- POSIX BRE / ERE:傳統 grep、sed 用的老派語法。BRE 裡
+?{}|(要加反斜線才有特殊意義;加了-E(ERE)才跟主流一致。這就是本文 grep 範例都用-E的原因。 - PCRE / .NET / Python / JavaScript:現代主流方言,
\d\w\s這些簡寫、(?:...)這種進階群組都支援。PowerShell 用的是 .NET 版、VS Code 用的是 JavaScript 版,兩者跟 Python 大同小異。 - findstr:如前所述,自成一格的閹割版,只能算「遠房親戚」。
看懂這層就抓到重點:\d、+、| 這類「進階但常用」的寫法,在現代工具(PowerShell、VS Code、Python)幾乎一定通;但丟到基礎 grep 要記得加 -E,丟到 findstr 則直接放棄。與其死背每種方言,不如記住「先確認手上工具是哪一派」。
💡 總結:站長的幾個實戰提醒
用了這麼多年正規表示式,站長我最想跟新手講的不是語法,而是幾個「省下重寫時間」的習慣。第一,任何規則先拿樣本試跑再放大:抓資料先用 grep -o 看它到底框到什麼、取代先只看螢幕輸出,確認對了再動整個資料夾。regex 最危險的不是寫不出來,而是「以為對了、其實多框或少框」,尤其貪婪比對——<.*> 會一路吃到最後一個 >,想只吃一段要寫成非貪婪的 <.*?>,這個差別實測差很多,務必自己跑一次感受一下。
第二,別和工具的方言硬拚。同一條 ERROR|WARN,在 PowerShell Select-String 一秒搞定,在 findstr 卻因為不支援 | 而靜靜失敗、連錯誤訊息都不給——這種「無聲翻車」最花時間。與其疑惑,不如一開始就選對工具:命令列優先 grep(加 -E)或 PowerShell,要圖形介面就用 VS Code、PowerRename。第三,點號記得跳脫。. 在 regex 是「任意字元」,你想找真正的網域點或副檔名點,要寫 \.,不然 report.txt 的規則會連 reportatxt 都比對到。把這三件事變成反射動作,regex 就從「看起來像亂碼」變成你每天最順手的工具。
❓ 常見問題
Q:正規表示式符號好多,一定要全部背起來嗎?
不用。實務上九成場景只會用到 . \d \w [ ] + * {n,m} ^ $ | ( ) 這十來個。把步驟一那張表存起來,用到再查,寫個五六次自然就記住了。進階符號(前瞻、後顧)等有需要再學。
Q:我照網路上的 regex 貼進 Windows 的 findstr,為什麼找不到?
八成是撞到 findstr 不支援的語法。依微軟官方文件,findstr /R 不支援 |、\d、+、{n,m}。網路上的 regex 多半是 PCRE / grep 風格,直接貼會失效。解法是改用 PowerShell 的 Select-String(語法跟主流一致),或把規則改寫成 findstr 認得的基本符號。
Q:批次取代前,怎麼確認不會改錯?
先做「乾跑(dry run)」。sed 不加寫回、只看螢幕輸出;PowerRename 看即時預覽;寫程式先 print 出新舊對照。確認每一筆都對,再真的寫回檔案,並且對重要資料夾先備份。regex 取代很強,但也因為太快,錯了是一次錯一整批。
🔗 延伸閱讀
- Everything 檔案搜尋神器完整教學:Windows 秒搜檔案,語法、安裝一次學會
- [2026 必裝神器] Windows PowerToys 深度調校:微軟沒告訴你的 3 個「外掛級」功能
- Windows 工作排程器教學:讓電腦定時自動幫你跑程式、備份、腳本
- FFmpeg 教學:一行指令壓縮影片、轉檔,免裝笨重轉檔軟體
📎 參考資料來源
📖 第一級|官方文件:
- Microsoft Learn:Select-String(Microsoft.PowerShell.Utility) — 2026-07-05 查證
- Microsoft Learn:findstr 指令 — 2026-07-05 查證
- Microsoft Learn:about_Comparison_Operators(-replace 使用 regex) — 2026-07-05 查證
- Python 官方文件:re — 正規表示式操作 — 2026-07-05 查證
📖 第二級|工具官方說明:
- Visual Studio Code Docs:Search across files(regex) — 2026-07-05 查證
⚠️ 本文語法範例於 GNU grep 3.7、GNU sed 4.8、Python 3.10.12 環境實際執行驗證;Windows 工具行為以微軟官方文件為準,非站長硬體實測。
📅 本文查證戳記:2026-07-05 彙整官方文件與可重現範例撰寫。若你在特定工具版本遇到語法差異,歡迎在留言區回報,站長會更新文章。