正则表达式从入门到不懵逼

每次写正则都要查半天,好不容易写出来过两天又忘了。这次系统地整理一遍,把最常用的模式记下来。

基础语法速查

js 复制代码
const str = 'Hello 2026, my email is test@example.com'

// 字符匹配
/Hello/.test(str)         // true --- 包含 "Hello"
/[0-9]/.test(str)         // true --- 包含数字
/\d+/.exec(str)           // ["2026"] --- \d 是 [0-9],+ 是一个或多个

// 常用简写
// \d = [0-9]    \D = [^0-9]
// \w = [a-zA-Z0-9_]  \W = 非 \w
// \s = 空格/Tab/换行   \S = 非空白
// . = 除换行外的任意字符

量词

js 复制代码
/a*/    // 0 个或多个 a
/a+/    // 1 个或多个 a
/a?/    // 0 个或 1 个 a
/a{3}/  // 恰好 3 个 a
/a{2,5}/ // 2 到 5 个 a
/a{2,}/  // 至少 2 个 a

贪婪 vs 非贪婪:

js 复制代码
const html = '<b>hello</b> and <i>world</i>'

// 贪婪(默认):匹配到最后一个 >
html.match(/<.*>/)   // ["<b>hello</b> and <i>world</i>"]

// 非贪婪(加 ?):匹配到第一个 >
html.match(/<.*?>/g) // ["<b>", "</b>", "<i>", "</i>"]

分组和捕获

js 复制代码
const date = '2026-09-17'
const match = date.match(/(\d{4})-(\d{2})-(\d{2})/)

match[0] // "2026-09-17" --- 完整匹配
match[1] // "2026" --- 第一个分组
match[2] // "09"   --- 第二个分组
match[3] // "17"   --- 第三个分组

// 命名分组(ES2018)
const named = date.match(/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/)
named.groups.year  // "2026"
named.groups.month // "09"

常用实战模式

js 复制代码
// 手机号(中国大陆)
/^1[3-9]\d{9}$/

// 邮箱(简化版,够用)
/^[\w.-]+@[\w.-]+\.\w+$/

// URL
/^https?:\/\/[\w.-]+(?:\/[\w./?%&=-]*)?$/

// 身份证号
/^\d{17}[\dXx]$/

// 中文字符
/[\u4e00-\u9fa5]+/

// 去除首尾空白
str.replace(/^\s+|\s+$/g, '')
// 其实 str.trim() 就行,但面试可能让你手写

// 驼峰转短横线
'backgroundColor'.replace(/[A-Z]/g, m => '-' + m.toLowerCase())
// "background-color"

// 千分位逗号
'1234567890'.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
// "1,234,567,890"

replace 的高级用法

js 复制代码
// 回调函数可以拿到分组
'John Smith'.replace(/(\w+)\s(\w+)/, (match, first, last) => {
  return `${last}, ${first}`
})
// "Smith, John"

// 用 $1, $2 引用分组
'2026-09-17'.replace(/(\d{4})-(\d{2})-(\d{2})/, '$2/$3/$1')
// "09/17/2026"

// lookahead(断言)
'abc123def'.replace(/\d+(?=[a-z])/, '***')
// "abc***def" --- 只匹配后面跟着字母的数字

// lookbehind(ES2018)
'price: 100'.replace(/(?<=price:\s)\d+/, '200')
// "price: 200" --- 只替换 price: 后面的数字

各语言的正则差异

特性 JS Python Java
字面量语法 /pattern/flags re.compile(r'pattern') Pattern.compile("pattern")
命名分组 (?<name>...) (?P<name>...) (?<name>...)
lookbehind ES2018 支持 支持 支持
Unicode 属性 \p{Script=Han} (ES2018) re.UNICODE \p{IsHan}

调试工具

推荐 regex101.com,实时匹配 + 解释每个符号的含义。写复杂正则的时候开着它,省得反复跑代码测试。

总结

正则不需要背,记住 \d \w \s 三个简写、* + ? {n,m} 四个量词、() 分组、^ $ 边界,就够覆盖 80% 的场景。剩下的查文档或者 regex101。

相关推荐
小白快快跑哦6 天前
python-字符串全解(六):正则表达式-转义与非转义
python·正则表达式·转义与非转义
zx_741484817 天前
【Linux入门】Shell 函数、正则表达式与文本处理:cut 与 awk
linux·运维·正则表达式
Patrick在香港10 天前
Claude Prompt 香港场景:公文里「今日」落在 6 个日历日上,「翌日」锚错了 5 天
python·自然语言处理·正则表达式·claude·数据清洗
梦帮科技12 天前
Next.js 16 模块化单体实战:App Router、领域模块与 Route Handler 分层
css·数据结构·链表·正则表达式·node.js·json·html5
yume_sibai18 天前
正则表达式完全指南(基础语法 + 实战应用 + 性能优化 + 最佳实践)
开发语言·正则表达式·c#
研☆香19 天前
js中使用的正则表达式
开发语言·javascript·正则表达式
2601_9622935324 天前
浅学python | 正则表达式集锦
正则表达式·字符串匹配·python知识·浅学python·ip地址检查
2601_9622955824 天前
Python中正则表达式的知识汇总分享
python·正则表达式·模块·语法·匹配
启观川24 天前
Python基础-第 16 章 综合案例:客户信息管理系统
开发语言·笔记·python·正则表达式