JavaScript RegExp 正则表达式:标记、属性与方法详解
JavaScript 中的 RegExp 对象用于定义规则以执行字符串匹配和查找操作。理解其匹配模式标记(g、i、m)、实例属性(如 source、lastIndex)及核心方法(exec、test)是高效处理文本数据的基础。
1. 匹配模式标记
正则表达式支持三种常用的模式标记,用于控制匹配行为:
g(global):全局模式。默认情况下,找到第一个匹配项后即停止;添加此标记后将继续搜索直到字符串末尾。i(ignoreCase):不区分大小写模式。使匹配过程忽略字母的大小写差异。m(multiline):多行匹配模式。允许^和$在每行的开头和结尾进行匹配,而非仅在整个字符串的开头和结尾。
可以通过两种形式创建正则表达式:字面量形式和构造函数形式。
// 使用字面量,匹配 "bat" 或 "cat",不区分大小写
var pattern1 = /[bc]at/i;
// 使用构造函数,等效于上述代码
var pattern2 = new RegExp("[bc]at", "i");
注意:当使用 new RegExp() 构造函数时,模式参数需要是字符串。因此,正则表达式中的特殊字符需要进行双重转义。例如:
/\[bc\]at/转换为字符串为"\\[bc\\]at"/\.at/转换为字符串为"\\.at"/\d.\d{1,2}/转换为字符串为"\\d.\\d{1,2}"
2. RegExp 实例属性
每个 RegExp 实例都包含一系列只读属性,反映该正则表达式的配置和状态:
global:布尔值,表示是否设置了g标志。ignoreCase:布尔值,表示是否设置了i标志。multiline:布尔值,表示是否设置了m标志。lastIndex:整数,指定在字符串中下一次开始搜索的位置。仅在启用g标志时有意义。source:字符串,返回正则表达式的字面量形式原文。
var pattern = new RegExp("\\[bc\\]at", "i");
console.log(pattern.source); // 输出: "\\[bc\\]at"
3. RegExp 实例方法
exec() 和 test() 是 RegExp 最常用的两个方法,用于执行匹配检测。
第1步:使用 exec() 获取详细匹配信息
exec(string) 接受一个字符串参数,返回一个包含匹配信息的数组对象(如果没有匹配则返回 null)。返回的对象还包含 index(匹配位置)和 input(被搜索的字符串)属性。
var text = "mom and dad and baby";
var pattern = /mom( and dad( and baby)?)?/gi;
var matches = pattern.exec(text);
console.log(matches.index); // 0
console.log(matches.input); // "mom and dad and baby"
console.log(matches[0]); // "mom and dad and baby" (完整匹配)
console.log(matches[1]); // " and dad and baby" (第一捕获组)
console.log(matches[2]); // " and baby" (第二捕获组)
- 非全局模式 (
g):每次调用exec()都从字符串开头开始搜索,返回相同的匹配结果。 - 全局模式 (
g):每次调用exec()会从lastIndex指定的位置开始搜索,并更新lastIndex的值以指向下一个匹配的起始位置。
第2步:使用 test() 进行快速验证
test(string) 同样接受一个字符串参数,但仅返回布尔值:true 表示存在匹配,false 表示无匹配。它是判断字符串是否符合某种格式(如邮箱、手机号)的最快捷方式。
var text = "000-00-0000";
var pattern = /\d{3}-\d{2}-\d{4}/;
if (pattern.test(text)) {
console.log("匹配成功!");
} else {
console.log("匹配失败。");
}
4. RegExp 构造函数静态属性
RegExp 构造函数自身也拥有一些静态属性,它们存储的是最近一次执行的匹配相关信息。这些属性并非所有浏览器都完全兼容(如 Opera 对部分属性支持有限),但在调试和某些特定场景下仍具参考价值。
RegExp.input ($_):最近一次被匹配的字符串。RegExp.lastMatch ($&):最近一次的匹配项。RegExp.leftContext ($`):匹配项之前的文本。RegExp.rightContext ($'):匹配项之后的文本。RegExp.multiline ($*):布尔值,表示当前是否处于多行模式。RegExp.lastParen ($+):如果正则表达式中有捕获组,则保存最近一次的捕获组内容。RegExp.$1 ~ RegExp.$9:分别保存第 1 到第 9 个捕获组的匹配内容。
以下示例展示了如何通过这些属性提取上下文信息:
var text = "this has been a short summer";
var pattern = /(.)host/g;
if (pattern.test(text)) {
console.log(RegExp.input); // "this has been a short summer"
console.log(RegExp.lastMatch); // "short"
console.log(RegExp.lastParen); // "s" (如果 lastMatch 有捕获组)
console.log(RegExp.leftContext); // "this has been a "
console.log(RegExp.rightContext);// " summer"
}
// 演示捕获组静态变量
var text2 = "this has been a short summer";
var pattern2 = /(..)or(.)/g;
pattern2.test(text2);
console.log(RegExp.$1); // "sh"
console.log(RegExp.$2); // "t"
以上就是关于 JavaScript RegExp 正则表达式的详细内容,更多关于 JavaScript 基础用法的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









