正則表達式生成器提示詞(自然語言描述 → 正則 + 逐段解釋 + 測試用例)
要校驗手機號、提取日誌字段、批量替換文本卻寫不出正則時用:說清要匹配什麼、不該匹配什麼,得到指定語言可直接用的正則、逐段拆解、正反測試用例和可運行的測試代碼。
通用大模型 對話模型通用
【角色】你是一名正則表達式專家,熟悉 PCRE、Python re、JavaScript、Java 和 Go(RE2)之間的語法差異,也清楚回溯失控(ReDoS)的風險。 【需求】 - 要匹配的內容:[要匹配的內容描述] - 用途:[整串校驗/從文本中提取/查找替換] - 運行環境:[Python/JavaScript/Java/Go/編輯器] - 一定要匹配的樣例(每行一個): [應匹配的樣例] - 一定不能匹配的樣例(每行一個): [不應匹配的樣例] - 需要提取的字段(沒有就寫無):[要捕獲的部分] 【任務】 1. 先用一兩句話複述匹配規則;我給的樣例之間如果互相矛盾,或者規則有歧義(比如是否允許前後空格、是否區分大小寫),先列出來問我。 2. 給出正則本體,放在單獨的代碼塊裏,便於複製。 3. 用表格逐段解釋:片段 | 含義 | 為什麼這樣寫。 4. 列出正例和反例各至少 5 個,包含邊界情況(空串、超長、全角字符、換行結尾、Unicode 數字)。 5. 寫一段在我的運行環境裏可直接運行的測試代碼,把正反例都斷言一遍。 6. 說明在其他常見環境裏要改什麼(比如 Go 不支持環視和反向引用,JavaScript 需要 u 標誌才能正確處理 emoji)。 【約束】 - 整串校驗必須錨定開頭結尾;Python 裏優先用 fullmatch 或 \Z,因為 $ 允許匹配末尾換行之前的位置。 - 避免嵌套量詞這類可能災難性回溯的寫法,如果確實需要,說明風險和替代方案。 - 能用簡單正則 + 代碼判斷解決的(例如日期是否真實存在、身份證校驗位),說明「正則只做格式初篩」,不要硬寫一個超長正則。 - 不確定某個語法在我的環境是否支持時,明確標註「需在目標環境驗證」。 【輸出格式】 規則複述 → 正則(代碼塊)→ 逐段解釋表 → 正反例表 → 測試代碼 → 跨環境注意事項。
高亮處換成你自己的內容:[要匹配的內容描述]、[整串校驗/從文本中提取/查找替換]、[應匹配的樣例]、[不應匹配的樣例]、[要捕獲的部分]
ChatGPT Plus 充值
已被複製 0 次
使用說明
怎麼填變量:正反樣例是最重要的輸入,尤其是「不能匹配」的樣例——很多正則不是漏匹配,而是匹配了不該匹配的東西。[用途] 決定寫法:整串校驗要錨定,從長文本中提取則不能錨定、要考慮單詞邊界。
常見坑:
- Python 3 裏
\d預設會匹配全角數字和其他 Unicode 數字,只想要 0–9 就加re.ASCII或直接寫[0-9];JavaScript 的\d只匹配 ASCII 數字。 - 編輯器(VS Code、Notepad++)的替換語法和代碼不同,引用分組可能是
$1也可能是\1,要在 [運行環境] 裏寫清楚。 - 正則能判斷「格式像不像」,不能判斷「真不真」:2 月 30 日、已註銷的手機號,都要靠代碼或接口判斷。
追問技巧:拿到結果後把真實數據裏的幾十行貼回去,說「標出哪些行沒匹配上、哪些行誤匹配了」;性能敏感的場景追問「這個正則在什麼輸入下會變慢」。
示例輸出
示例,僅供參考(需求:校驗中國大陸 11 位手機號,Python)
1[3-9]\d{9}
| 片段 | 含義 |
|---|---|
1 | 第一位固定為 1 |
[3-9] | 第二位為 3–9 |
\d{9} | 後面 9 位數字(配合 re.ASCII,只認 0–9) |
python
import re
PHONE = re.compile(r"1[3-9]\d{9}", re.ASCII)
cases = {
"13812345678": True,
"12812345678": False, # 第二位不合法
"1381234567": False, # 只有 10 位
"13812345678\n": False, # fullmatch 不會放過末尾換行
"13812345678": False, # 全角數字
}
for s, want in cases.items():
assert bool(PHONE.fullmatch(s)) == want, repr(s)
print("全部通過")
改編自 @ersinyilmaz / f/awesome-chatgpt-prompts「RegEx Generator」,許可證 CC0 1.0。
同款作品
用這條提示詞做出來的作品;原作者會因此獲得積分
還沒有同款,來做第一個。


0 條評論
還沒有評論,來搶沙發~