JavaScript中的正则标志是附加在正则表达式后面的字母,用来调整正则的匹配规则,常见的标志包括g、i、m、s、u、y等,不同的标志对应不同的匹配行为,合理搭配标志可以满足多样化的匹配需求。

正则标志的作用与分类
正则标志不需要写在正则表达式的主体内容中,而是作为附加参数存在,能够全局改变正则的匹配逻辑。JavaScript目前支持的正则标志及对应含义如下:
| 标志 | 名称 | 作用说明 |
|---|---|---|
| g | 全局匹配 | 找到第一个匹配项后不停止,继续匹配后续所有符合规则的内容 |
| i | 忽略大小写 | 匹配时不区分英文字母的大小写,比如a和A会被视为相同 |
| m | 多行匹配 | 让^和$能够匹配字符串中每一行的开头和结尾,而不是整个字符串的开头和结尾 |
| s | dotAll模式 | 让.能够匹配包括换行符在内的所有单个字符,默认情况下.不能匹配换行符 |
| u | Unicode模式 | 启用Unicode匹配,能够正确匹配4字节的Unicode字符,比如emoji表情 |
| y | 粘性匹配 | 从正则对象的lastIndex属性指定的位置开始匹配,且必须连续匹配成功 |
两种正则定义方式下添加标志的方法
字面量方式添加标志
使用正则字面量定义正则表达式时,标志直接跟在最后一个斜杠后面,多个标志可以连续写在一起,不需要分隔符。
// 全局匹配+忽略大小写,匹配字符串中所有的hello(不区分大小写) const reg1 = /hello/gi; const str1 = "Hello world, hello JavaScript, HELLO test"; const result1 = str1.match(reg1); console.log(result1); // 输出 ["Hello", "hello", "HELLO"] // 多行匹配,匹配每一行开头是a的内容 const reg2 = /^a/gm; const str2 = "a first linenb second linena third line"; const result2 = str2.match(reg2); console.log(result2); // 输出 ["a", "a"]
RegExp构造函数方式添加标志
使用RegExp构造函数创建正则表达式时,第二个参数就是标志字符串,多个标志直接拼接即可。
// 定义全局匹配+dotAll模式的正则,匹配所有字符包括换行符
const reg3 = new RegExp("h.llo", "gs");
const str3 = "hnllo worldnhallo test";
const result3 = str3.match(reg3);
console.log(result3); // 输出 ["hnllo", "hallo"]
// 粘性匹配示例,从指定位置开始匹配
const reg4 = new RegExp("ab", "y");
const str4 = "ab abc ab";
reg4.lastIndex = 0;
console.log(reg4.test(str4)); // 输出 true,从0位置匹配到ab
reg4.lastIndex = 3;
console.log(reg4.test(str4)); // 输出 false,3位置是空格,无法连续匹配ab
标志使用的注意事项
首先,不是所有标志都可以随意组合,比如粘性匹配y和全局匹配g同时使用时,y的优先级更高,匹配行为会遵循y的规则。其次,使用RegExp构造函数时,如果第一个参数是字符串,里面的反斜杠需要转义,比如要匹配数字d,需要写成"\d"。另外,添加了全局标志g的正则,每次匹配后lastIndex会更新,重复使用同一个正则对象时需要注意重置lastIndex,否则可能出现匹配结果不符合预期的情况。
const reg5 = /test/g; const str5 = "test test test"; console.log(reg5.test(str5)); // 输出 true,lastIndex变为4 console.log(reg5.test(str5)); // 输出 true,lastIndex变为9 console.log(reg5.test(str5)); // 输出 false,lastIndex变为13,超出字符串长度 // 重置lastIndex后重新匹配 reg5.lastIndex = 0; console.log(reg5.test(str5)); // 输出 true
实际场景中的标志搭配示例
在实际开发中,经常需要组合使用多个标志来满足需求,比如需要提取HTML字符串中所有的标签名,并且不区分大小写,就可以同时使用g和i标志。
// 匹配所有HTML标签,不区分大小写,全局匹配 const reg6 = /<([a-z]+)>/gi; const str6 = "<Div>content</div><SPAN>test</SPAN>"; const tags = str6.match(reg6); console.log(tags); // 输出 ["<Div>", "</div>", "<SPAN>", "</SPAN>"]
JavaScript正则表达式正则标志RegExp修改时间:2026-06-17 01:51:16