javascript正则表达式是什么_如何匹配和提取字符串

发布时间 - 2026-01-08 00:00:00    点击率:
JavaScript正则表达式是RegExp对象而非字符串,字面量(如/\d+/)与构造函数(new RegExp('\\d+'))转义规则不同;test()判断、exec()提取单个(支持捕获组)、match()提取全部(全局时丢失捕获组)。

JavaScript 正则表达式是什么?它不是字符串,是 RegExp 对象

JavaScript 中的正则表达式本质是一个 RegExp 实例,不是普通字符串。虽然可以用字面量写成 /\d+/,也可以用构造函数 new RegExp('\\d+'),但两者在转义和动态构建时行为不同——尤其注意:构造函数的 pattern 参数是字符串,反斜杠需双写,而字面量里单写即可。

常见误解是把 /\d+/ 当作“字符串”,结果在拼接动态内容时出错。比如想匹配用户输入的关键词 keyword,写成 new RegExp('/' + keyword + '/g') 就完全错了——/ 在字符串里只是字符,不会触发正则语法,正确写法是 new RegExp(keyword, 'g')

test()exec()match() 区分「判断」「提取单个」「提取全部」

三个最常用方法用途明确,混用容易漏数据或报错:

  • test() 只返回 true/false,适合做条件判断,比如表单校验:/^[a-z0-9_]+$/i.test(username)
  • exec() 每次只返回第一个匹配及其捕获组(含 indexinput 等属性),全局模式下需循环调用;不加 g 标志会反复返回第一个结果
  • match() 对非全局正则返回数组(含捕获组),对全局正则只返回纯匹配字符串数组,**丢失捕获组信息**;想拿捕获组又需要全部匹配,必须用 exec() 循环
const str = 'price: $12.99, qty: 5';
const re = /(\w+): \$?(\d+\.\d+)/g;
let result;
while ((result = re.exec(str)) !== null) {
  console.log('字段:', result[1], '值:', result[2]);
}
// 输出:字段: price 值: 12.99 → 字段: qty 值: 5

gim 标志的实际影响远不止“全局”“忽略大小写”

标志改变的是正则引擎的匹配逻辑,不是简单开关:

立即学习“Java免费学习笔记(深入)”;

  • glastIndex 生效,影响 exec()replace() 的多次执行;但 match() 加不加 g 返回结构完全不同
  • i 不仅匹配 ASCII 字母,还覆盖 Unicode 字母(如中文拼音、德语变音符),但对汉字、数字无影响
  • m 只有在正则中用了 ^$ 时才起作用——它让这两个锚点匹配每行开头/结尾,而不是整个字符串首尾;没用 ^/$ 时加 m 完全无感

典型陷阱:/^error/i.test('ERROR: timeout') 返回 true,但 /^error/im.test('line1\nERROR: timeout') 仍返回 false,因为换行后 ERROR 不在行首(前面有 \n)。

提取 URL 中的协议、域名、路径,别硬写 split()indexOf()

用正则提取结构化 URL 比手撕字符串更稳,关键是合理使用非贪婪和字符组:

const url = 'https://api.example.com/v1/users?id=123#top';
const match = url.match(/^(\w+):\/\/([^/]+)(\/[^?#]*)?/);
if (match) {
  console.log('协议:', match[1]);     // https
  console.log('域名:', match[2]);     // api.example.com
  console.log('路径:', match[3] || '/'); // /v1/users
}

注意点:

  • [^/]+.*? 更安全,避免跨到路径部分
  • \/[^?#]* 显式排除查询参数和 hash,比 \/.* 精确
  • 括号必须成对,空路径用 (...)? 并检查 match[3] 是否为 undefined

真正难的不是写出正则,而是想清楚边界——比如是否允许端口、IPv6 地址、带用户信息的 URL(user:pass@host)。简单场景够用,复杂需求建议用 URL 构造函数解析。


# javascript  # word  # java  # 正则表达式  # ipv6  # 端口  # 字符串数组 


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


相关推荐: 如何在IIS7中新建站点?详细步骤解析  Laravel PHP版本要求一览_Laravel各版本环境要求对照  如何挑选最适合建站的高性能VPS主机?  如何在IIS管理器中快速创建并配置网站?  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  如何在云指建站中生成FTP站点?  Laravel怎么实现验证码(Captcha)功能  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  Laravel如何创建自定义Artisan命令?(代码示例)  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Laravel如何实现API速率限制?(Rate Limiting教程)  北京专业网站制作设计师招聘,北京白云观官方网站?  ,南京靠谱的征婚网站?  北京网站制作的公司有哪些,北京白云观官方网站?  javascript如何操作浏览器历史记录_怎样实现无刷新导航  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  java获取注册ip实例  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  Python自动化办公教程_ExcelWordPDF批量处理案例  jQuery中的100个技巧汇总  轻松掌握MySQL函数中的last_insert_id()  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  如何用西部建站助手快速创建专业网站?  *服务器网站为何频现安全漏洞?  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  免费视频制作网站,更新又快又好的免费电影网站?  Python文件流缓冲机制_IO性能解析【教程】  如何在建站宝盒中设置产品搜索功能?  重庆市网站制作公司,重庆招聘网站哪个好?  如何快速使用云服务器搭建个人网站?  Linux系统命令中tree命令详解  Android利用动画实现背景逐渐变暗  高防服务器租用如何选择配置与防御等级?  JS弹性运动实现方法分析  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  在线制作视频的网站有哪些,电脑如何制作视频短片?  Bootstrap整体框架之CSS12栅格系统  微信小程序 scroll-view组件实现列表页实例代码  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  JavaScript中如何操作剪贴板_ClipboardAPI怎么用