快訊
2026-07-11
腳本自動化

正規表示式 regex 入門:找檔案、抓資料、批次改文字一次學會

約 9 分鐘閱讀

⚡ 站長快讀:核心重點

  • 文章屬性:教學實戰(跨工具通用技能)
  • 適用系統: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.cabc、a9c、a-c
\d一個數字(0–9)\d\d07、26
\w一個字元(英數或底線)\w+Report_01
\s一個空白a\sb「a b」
[abc]中括號內任一個[ap]ngang、png
^ $行首、行尾^ERROR以 ERROR 開頭的行
* + ?前一項出現 0+、1+、0 或 1 次ab+ab、abbb
{n,m}前一項出現 n 到 m 次\d{2,4}26、2026
|或(擇一)png|jpgpng 或 jpg
( )群組(可被擷取)(19|20)\d\d2026
\跳脫(取消特殊意義)\.真正的點「.」

📋 重點摘要

  • 記三類就夠開始:代表字元的(. \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 有即時預覽欄;寫程式則先用 print 印出「舊名 → 新名」對照,確認無誤再真的動手。重要資料夾先備份再批次操作。

步驟六:在編輯器裡用 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 取代很強,但也因為太快,錯了是一次錯一整批。


🔗 延伸閱讀

📎 參考資料來源

📖 第一級|官方文件:

📖 第二級|工具官方說明:

⚠️ 本文語法範例於 GNU grep 3.7、GNU sed 4.8、Python 3.10.12 環境實際執行驗證;Windows 工具行為以微軟官方文件為準,非站長硬體實測。

📅 本文查證戳記:2026-07-05 彙整官方文件與可重現範例撰寫。若你在特定工具版本遇到語法差異,歡迎在留言區回報,站長會更新文章。

廣告