javascript如何使用正则表达式进行文本处理【教程】
技术百科
紅蓮之龍
发布时间:2026-01-28
浏览: 次 JavaScript正则关键在于正确选择字面量或RegExp构造函数、区分exec/match返回结构、警惕g标志缺失导致静默失败;静态模式用字面量,动态变量需RegExp并转义特殊字符;需捕获组+全局遍历时用exec,取全部匹配用matchAll,替换复杂逻辑用函数参数。
JavaScript 里用正则表达式做文本处理,关键不是“会不会写正则”,而是「什么时候该用 RegExp 构造函数,什么时候直接写字面量」、「exec 和 match 返回结构为什么总搞混」、「全局标志 g 不加会静默失败」。
字面量 vs RegExp 构造函数:别在运行时拼接正则
字面量写法(如 /\d+/g)在代码加载时就编译好,性能好、可读性强;RegExp 构造函数(如 new RegExp('\\d+', 'g'))适合模式动态生成。但注意:字符串转义要翻倍——'\\d+' 才能表示一个 \d+,漏掉一个反斜杠就会匹配字面的 d+。
- 静态模式(比如校验邮箱、提取日期)→ 优先用字面量
- 模式含变量(比如搜索用户输入的关键词)→ 必须用
RegExp,且对变量内容做replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')转义 - 不要写
new RegExp('/\\d+/g')—— 斜杠和标志是字面量语法,构造函数里传了就是错的
exec 和 test:需要反复匹配或带状态时才用
exec 是唯一能配合 g 标志「记住上次位置」的方法,适合循环提取所有匹配;test 只返回布尔值,但会偷偷修改 lastIndex(尤其在共享正则对象时容易出错)。不用 g 时,exec 和 test 行为稳定;加了 g 就得小心重用同一个正则实例。
- 只判断是否存在 → 用
test,但别复用带g的正则对象 - 要取全部匹配结果 → 用
match或matchAll(见下条),别手写exec循环 - 必须用
exec的场景:需要捕获组 + 全局遍历 + 同时访问index和input属性
match、matchAll、replace:日常文本处理主力
match 在无 g 时返回带捕获组的数组([fullMatch, group1, group2]),有 g 时只返回纯匹配字符串数组(丢弃分组);matchAll 总是返回迭代器,每个元素都是完整 exec 结果,安全又清晰;replace 的第二个参数可以是字符串(支持 引用捕获组)或函数(参数依次为匹配全文、各捕获组、起始索引、原

立即学习“Java免费学习笔记(深入)”;
- 想拿所有匹配 + 捕获内容 → 用
matchAll,别用match加g - 替换逻辑简单(比如统一换前缀)→ 字符串替换,如
'abc'.replace(/^/, 'X-') - 替换依赖匹配内容(比如把数字乘以 2)→ 用函数替换:
'a1b2'.replace(/(\d)/g, (_, d) => +d * 2)
常见陷阱:标志、Unicode、边界问题
g(全局)、i(忽略大小写)、m(多行)三个标志最常用,但 u(Unicode)容易被忽略:没有它,\w 不匹配中文,. 不匹配 emoji,^/$ 在换行符处行为异常;y(粘性)几乎没人用,除非你真在模拟流式解析。
- 处理中文、emoji、生僻字 → 正则开头加
u,比如/\p{Script=Han}/u - 想匹配单词边界但含中文 →
\b失效,改用(? 或直接按需切分 -
^和$默认只匹配整个字符串首尾,多段文本每行都要匹配?加m标志
真正难的不是写出一个能跑的正则,而是当它在线上突然不匹配、或无限循环(回溯爆炸)时,你能快速定位是标志没开、转义漏了、还是 Unicode 边界没对齐。
# 关键词
# 就会
# 都是
# 都要
# 没人
# 什么时候
# input
# 循环
# 对象
# javascript
# java
# 构造函数
# 字符串
# 为什么
# 遍历
# 邮箱
# 正则表达式
# 不匹配
# 切分
# 字符串数组
# regexp
# 生僻字
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win10怎样卸载iTunes_Win10卸载iT
- 如何在Mac上搭建Golang开发环境_使用Hom
- Win11怎么关闭任务栏小图标_Windows11
- Linux怎么实现内网穿透_Linux安装Frp客
- Windows电脑如何进入安全模式?(多种按键方法
- Win11怎么关闭触控板_Win11笔记本禁用触摸
- Win11玩游戏全屏闪退怎么办_Win11全屏优化
- 如何在 Go 中可靠地测试含 time.Time
- Win10如何卸载自带Edge_Win10彻底卸载
- Win11怎么查看显卡温度 Win11任务管理器查
- 短链接怎么自定义还原php_修改解码规则适配需求【
- php错误怎么开启_display_errors与
- php485能和物联网模块通信吗_php485对接
- 如何在Golang中处理数据库事务错误_回滚和日志
- Flask 表单数据通过 SMTP 发送邮件的完整
- Win10怎么关闭自动更新错误弹窗_Win10策略
- Win10电脑C盘红了怎么清理_Windows10
- 如何在Golang中理解指针比较_Golang地址
- Linux如何使用Curl发送请求_Linux下A
- Windows10如何更改桌面图标间距_Win10
- php8.4如何配置ssl证书_php8.4htt
- Python迭代器生成器进阶教程_节省内存与懒加载
- Windows10系统怎么查看运行时间_Win10
- 如何在Golang中处理通道发送接收错误_防止阻塞
- Win11摄像头无法使用怎么办_Win11相机隐私
- 如何在 Windows 11 中使用 AlomWa
- Win11怎么设置默认图片查看器_Windows1
- 如何在Golang中实现微服务负载均衡_Golan
- Windows10无法识别USB设备描述符请求失败
- MAC怎么一键隐藏桌面所有图标_MAC极简模式切换
- Win11怎么设置ipv4地址_Windows 1
- 如何使用Golang encoding/json解
- Win11怎么设置指纹解锁 Win11笔记本录入指
- C++如何使用std::optional?(处理可
- PythonDocker高级项目部署教程_多容器管
- Win10 BitLocker加密教程 Win10
- 如何在Golang中捕获结构体方法错误_Golan
- windows如何测试网速_windows系统网络
- Windows 10怎么隐藏特定更新补丁_Wind
- Win10如何更改用户账户控制_Windows10
- Mac如何备份到iCloud_Mac桌面与文稿文件
- 如何高效删除 NumPy 二维数组中所有元素相同的
- Win10怎样清理C盘Steam游戏缓存_Win1
- Win11开机自检怎么关闭_跳过Win11开机磁盘
- php8.4新语法match怎么用_php8.4m
- Win11怎么设置触控板手势_Windows11三
- Win11局域网共享怎么设置 Win11文件夹网络
- 如何在Golang中使用内置函数_Golangle
- Win11怎么解压RAR文件 Win11自带解压功
- PHP中require语句后直接调用返回对象方法的

QQ客服