跳转到主内容
极星编程网:以代码为星,赴技术山海!

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

JavaScript正则关键在写对用稳:字面量适合静态,new RegExp适合动态但需双写反斜杠;match/exec/test/replace行为差异大;常见失败因转义、标志、边界处理不当;应平衡性能与可读性,复杂场景优先用专用解析器。 JavaScript 正则表达式 不是“写出来就能用”,关键在**边界控制、转义处理和标志位选择**。直接套用网上示例常导致
test()
返回
false
、
match()
返回
null
,或意外匹配过多内容。 怎么写反斜杠和特殊字符的字面量 JS 中正则有两种创建方式:
RegExp
构造函数和字面量(
/.../
)。二者对反斜杠的处理不同,这是最常踩的坑。 字面量写法:
/d+.d+/
表示“一个或多个数字 + 点 + 一个或多个数字”,其中点
.
被当作元字符;要匹配真实的小数点,必须写成
/d+.d+/
(即用
.
) 构造函数写法:
new RegExp("\d+\.\d+")
—— 注意:字符串里反斜杠本身要转义,所以
.
得写成
"\."
,
d
得写成
"\d"
如果正则里要匹配反斜杠本身(如 Windows 路径
C: empile.txt
),字面量写为
/C:\temp\file.txt/
;构造函数则需四个反斜杠:
new RegExp("C:\\temp\\file\.txt")
为什么
match()
有时返回
null
,有时返回数组
String.prototype.match()
的行为取决于是否启用
g
(全局)标志: 无
g
:返回数组(含
index
、
input
等属性),即使只匹配一次;未匹配则返回
null
有
g
:只返回纯匹配 字符串数组 ,不带额外信息;未匹配仍为
null
想确保安全取值,别直接访问
result[0]
,先判断
result && result[0]
const str = "price: $19.99, discount: $5.50"; str.match(/$d+.d+/g); // ["$19.99", "$5.50"] str.match(/$d+.d+/); // ["$19.99", index: 7, input: "...", groups: undefined]
如何正确提取括号中的捕获组内容 用圆括号
()
定义捕获组后,匹配结果中对应位置是子匹配项。但注意:
exec()
比
match()
更可靠,尤其带
g
时: Trae win Trae Windows 官方版本现已全面支持 Win10 和 Win11 系统(64位)。国内开发者可直接访问 Trae 中文官网(trae.cn 或 trae.com.cn),一键下载官方正版 .exe 安装包,享受国内直连的高速稳定体验。安装过程极其简便,双击即可运行,并支持一键无缝导入 VS Code 或 Cursor 的原有主题、快捷键及插件配置。登录支持手机号、微信或稀土掘金账号。内置免费的豆包与 DeepSeek 等顶级大模型,让你开箱即用,轻松开启高效的 AI 智能编程之旅。 下载 立即学习 “ Java免费学习笔记(深入) ”;
exec()
每次调用返回下一个匹配(含捕获组),适合循环提取
match()
+
g
会丢弃所有捕获组信息 非捕获组用
(?:...)
避免污染结果数组长度
const re = /(w+): ($d+.d+)/g; const str = "total: $123.45, tax: $12.30"; let match; while ((match = re.exec(str)) !== null) { console.log("key:", match[1], "value:", match[2]); // → "key:" "total" "value:" "$123.45" // → "key:" "tax" "value:" "$12.30" }
常见错误:忽略
^
、
$
和
的语义差别 不加锚点就容易“跨词匹配”或“部分命中”。比如验证 邮箱 格式,
/w+@w+.w+/
会把
"abc@def.ghi.xyz"
中的
"def.ghi"
当作合法匹配——因为它确实符合模式,但不是完整邮箱。
^
和
$
锚定整个字符串起止(常用于表单验证)
是单词边界,适用于在一段文本中找独立单词(如替换
"cat"
但不碰
"category"
) 模糊搜索常用
.*
,但性能差且易贪婪匹配过长;优先考虑更具体的替代,如
[^"]*
替代
.*
匹配引号内内容 真正难的不是写出能跑的正则,而是写出**不误匹配、不漏匹配、不卡死引擎**的正则。尤其是嵌套结构(HTML 标签、括号配对)或变长重复,JS 原生正则并不支持递归匹配,这时候该换解析器,而不是硬刚
.*?
。

相关文章