javascript正则表达式怎么写_如何用它进行字符串匹配【教程】

发布时间 - 2026-01-27 00:00:00    点击率:
JavaScript正则表达式需关注构造方式(字面量或RegExp构造函数)、标志位组合及方法选择;test()返回布尔值,exec()返回匹配详情且具状态;match()行为取决于g标志,全局匹配推荐matchAll();注意点号、贪婪、Unicode和flag冲突等陷阱。

JavaScript 正则表达式不是“写出来就能用”,关键在 RegExp 实例的构造方式、标志位组合,以及匹配方法(test()exec()match() 等)的选择是否匹配你的目标场景。

怎么创建一个有效的正则表达式对象

两种写法:字面量和构造函数。字面量更常用,但动态拼接时必须用 RegExp 构造函数。

  • 字面量:/\d{3}-\d{4}/ —— 不能拼变量,斜杠间不能有空格,转义用 \\
  • 构造函数:new RegExp('\\d{3}-\\d{4}') —— 字符串里反斜杠要双写,否则会被 JS 字符串解析吃掉一层
  • 带标志位:/abc/gi 等价于 new RegExp('abc', 'gi');但 new RegExp('abc', 'g' + 'i') 也合法

test()exec() 的核心区别在哪

test() 只返回布尔值,适合做“是否存在匹配”判断;exec() 返回匹配详情(含 indexgroups),且对全局正则有状态(lastIndex),多次调用会继续往后找。

  • test() 判断邮箱格式:/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)
  • exec() 提取所有数字:const re = /\d+/g; let m; while ((m = re.exec(str)) !== null) { console.log(m[0]); }
  • ⚠️ 全局正则被多个 exec() 复用时,lastIndex 不重置会导致漏匹配 —— 建议每次用前手动设 re.lastIndex = 0,或改用 str.match(re)

为什么 match() 有时返回 null,有时是数组

match() 行为取决于正则是否带 g 标志:

  • g:返回第一个匹配的详细信息数组(含 indexinput),没匹配则 null
  • g:只返回纯匹配字符串数组,不带位置信息;捕获组全丢弃
  • 想同时拿到全局匹配 + 捕获组?别用 match(),改用 matchAll()(ES2025+):[...str.matchAl

    l(/(\d+)-(\d+)/g)]
    返回迭代器,每个元素是带分组的数组

常见陷阱:点号、贪婪、Unicode 和 flag 冲突

点号 . 默认不匹配换行符,^/$ 默认只认字符串首尾,\w 不包含中文 —— 这些都容易误判。

  • . 匹配换行:/pattern/ss flag,又称“dotAll”);没这个 flag 时用 [\s\S] 替代
  • 避免过度贪婪:.* 会吞到最右再回退;要最小匹配就加 ?.*?\w+?
  • 匹配中文等 Unicode 字符:/\p{Script=Han}/u(需 u flag),普通 \w 在中文环境基本失效
  • gy(sticky)不能共存;m(多行)让 ^/$ 匹配每行起止,不是整个字符串

真正难的不是写出一个能跑的正则,而是预判它在边界输入(空字符串、特殊符号、超长文本、不同编码)下的行为 —— 尤其是全局模式复用、标志位叠加、Unicode 处理这三块,最容易在线上突然出错。


# javascript  # java  # js  # 正则表达式  # 编码  # ai  # 邮箱  # 区别  # 字符串解析  # 字符串数组  # 为什么  # NULL  # while  # 构造函数  # const  # 字符串 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  Laravel如何实现数据库事务?(DB Facade示例)  javascript读取文本节点方法小结  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何快速搭建高效香港服务器网站?  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  动图在线制作网站有哪些,滑动动图图集怎么做?  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  Laravel怎么实现模型属性的自动加密  电商网站制作价格怎么算,网上拍卖流程以及规则?  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  如何正确选择百度移动适配建站域名?  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  如何在万网自助建站中设置域名及备案?  如何用狗爹虚拟主机快速搭建网站?  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  如何为不同团队 ID 动态生成多个独立按钮  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  Java解压缩zip - 解压缩多个文件或文件夹实例  如何在IIS中配置站点IP、端口及主机头?  如何在自有机房高效搭建专业网站?  Android 常见的图片加载框架详细介绍  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  北京网站制作公司哪家好一点,北京租房网站有哪些?  Internet Explorer官网直接进入 IE浏览器在线体验版网址  微信h5制作网站有哪些,免费微信H5页面制作工具?  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  JavaScript如何实现类型判断_typeof和instanceof有什么区别  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  如何在香港服务器上快速搭建免备案网站?  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  Python图片处理进阶教程_Pillow滤镜与图像增强  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  如何在阿里云ECS服务器部署织梦CMS网站?  高端网站建设与定制开发一站式解决方案 中企动力  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  如何构建满足综合性能需求的优质建站方案?  如何在阿里云虚拟主机上快速搭建个人网站?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体