javascript中正则表达式是regexp对象实例,属引用类型;创建有字面量(/pattern/flags)和构造函数(new regexp(pattern, flags))两种方式,后者需双写反斜杠;核心方法test()、match()、replace()、exec()用途各异,需按需选用;标志g、i、m、s、u影响匹配行为,贪婪匹配默认,懒惰用.*?;动态生成正则须转义用户输入。

JavaScript 中没有“正则表达式数据类型”这一独立类型,正则表达式是 RegExp 对象的实例,属于引用类型(object),和数组、日期一样,有自己专属的构造方式、属性和方法。
创建正则:字面量 vs 构造函数
两种写法本质相同,但适用场景不同:
-
字面量写法(推荐用于静态模式):
/d{3}-d{4}/i—— 反斜杠不用双写,写法简洁,性能略优 -
构造函数写法(必须用于动态模式):
new RegExp(`\d{3}-\d{4}`, 'i')—— pattern 是字符串,反斜杠需双写(如\d),才能让正则引擎最终收到d
错误示例:new RegExp("/d+/g") —— 斜杠和 flag 都不该出现在字符串参数里,会报错或匹配异常。
核心方法:各司其职,别混用
不同方法返回值和用途差异明显,选错会导致逻辑漏洞:
-
test():只返回true或false,适合 if 判断;注意带g标志时有lastIndex状态,连续调用可能出错 -
match():返回匹配数组(含捕获组信息)或null;加g才返回全部匹配项,不加只返回第一个及分组细节 -
replace():用于替换,支持字符串模板(如$1引用捕获组)或函数回调 -
exec():每次只返回一个匹配结果(含index、input属性),配合g可循环调用提取全部
常见误用:if (str.match(/abc/)) { ... } —— 因为空数组 [] 是真值,而 null 是假值,行为不稳定;应改用 test() 或显式判断是否为 null。
关键标志与陷阱:别被默认行为坑了
标志不是可有可无的装饰,直接影响匹配逻辑:
-
g:全局匹配 —— 不加就只找第一个,match()和replace()行为完全不同 -
i:忽略大小写 —— 仅对 ASCII 字母有效,不影响中文、数字 -
m:多行模式 —— 让^和$匹配每行起止,不是“支持换行”,而是重定义锚点含义 -
s(dotAll):让.匹配包括换行符在内的所有字符;不支持该标志的老环境可用[sS]*替代 -
u:正确处理 Unicode(如 emoji、中文),否则.或w可能漏匹配
贪婪匹配是默认行为:.* 会吞掉尽可能多内容;想停在第一个闭合处,得用懒惰写法:.*?。
安全处理动态正则:转义不可少
用户输入的内容直接拼进正则,极易被当作元字符解析(如 .、*、[):
- 先对变量做转义:
userInput.replace(/[.*+?^${}()|[]\]/g, '\$&') - 再构造正则:
new RegExp(escapedInput, 'g') - 避免直接写:
new RegExp(userInput, 'g')—— 输入a.b会被当成 “a + 任意字符 + b”
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











