JavaScript(JS)中与正则表达式有关的方法介绍

本文详细介绍了RegExp对象的7个核心方法,包括compile、test、exec,以及它们在模式匹配、全局搜索、大小写敏感性和多行模式中的应用。同时,展示了如何利用String对象的相关方法进行字符串操作。
摘要由CSDN通过智能技术生成


在这里插入图片描述
一共有 7 个与正则表达式式相关的方法,这些方法分别来自于 RegExp 与 String 对象。

RegExp

RegExp 对象表示正则表达式, 主要用于对字符串执行模式匹配.

语法: new RegExp(pattern[, flags])

参数 pattern 是一个字符串, 指定了正则表达式字符串或其他的正则表达式对象。

参数 flags 是一个可选的字符串,包含属性 gim,分别用于指定全局匹配、区分大小写的匹配和多行匹配。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。

var pattern = "[0-9]";
// 构造正则表达式对象
var reg = new RegExp(pattern,"g");
var reg = new RegExp("[0-9]","g");
// 也可以直接输入字面量
var reg = /[0-9]/g;

RegExp 对象的属性

包含如下属性:

实例属性描述
global是否包含全局标志(true/false)
ignoreCase是否包含区分大小写标志(true/false)
multiline是否包含多行标志(true/false)
source返回创建RegExp对象时指定的表达式文本字符串形式
lastIndex表示原字符串中匹配的字符串最后一个字符后面的位置,默认为0
flags(ES6)返回正则表达式的修饰符
sticky(ES6)是否设置了y(粘连)修饰符(true/false)

compile

compile 方法用于在执行过程中改变和重新编译正则表达式。

语法:compile(pattern[, flags])

参数介绍请参考上述 RegExp 构造器,用法如下:

var reg = new RegExp("abc", "gi");
var reg2 = reg.compile("new abc", "g");
console.log(reg); // /new abc/g
console.log(reg2); // undefined

可见 compile 方法会改变原正则表达式对象,并重新编译,而且它的返回值为空。

test

test 方法用于检测一个字符串是否匹配某个正则规则,只要是字符串中含有与正则规则匹配的文本,该方法就返回 true,否则返回 false。

语法:test(string)

用法如下:

console.log(/[0-9]+/.test("abc123")); // true
console.log(/[0-9]+/.test("abc")); // false

以上,字符串”abc123” 包含数字,故 test 方法返回 true;而字符串”abc” 不包含数字,故返回 false。

实际上,如果正则表达式带有全局标志(带有参数 g)时,test 方法还受正则对象的 lastIndex 属性影响,如下:

var reg = /[a-z]+/; // 正则不带全局标志
console.log(reg.test("abc")); // true
console.log(reg.test("de")); // true
var reg = /[a-z]+/g; // 正则带有全局标志g
console.log(reg.test("abc")); // true,成功匹配到字符串 abc
console.log(reg.lastIndex); // 3, 最近 1 次匹配到的字符串最后 1 个字符后面的位置。下次运行 test 时,正则引擎将从索引为 3 的位置开始查找
console.log(reg.test("de")); // false,reg 对象的属性 lastIndex 的值为 3,所以只会从位置 3 开始尝试匹配,而字符串“de”根本就没有位置 3,所以直接匹配失败

exec

语法:exec(string)

exec() 方法的功能非常强大,它是一个通用的方法,而且使用起来也比 test() 方法以及支持正则表达式的 String 对象的方法更为复杂。

如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。我们可以看得出,在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 String.match() 返回的数组是相同的。

但是,当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在 RegExpObjectlastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObjectlastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0

var reg = /([a-z]+)/gi,string = "World Internet Conference";
var array = reg.exec(string);
console.log(array); // ["World", "World", index: 0, input: "World Internet Conference"]
console.log(RegExp.$1); // World
console.log(reg.lastIndex); // 5, 刚好等于 array.index + array[0].length

如上代码,可以看到 reg.lastIndex == array.index(匹配开始的位置)+ array[0].length(匹配字符串的长度

随着检索继续, array.index 的值会变成下个匹配字符串的开始位置, 相应地 reg.lastIndex 的值会变成下个匹配字符串的结束位置。我们也可以通过反复调用 exec 方法来遍历源字符串中所有的匹配字符串,直到 exec 方法再也匹配不到文本时,它将返回 null,并把 reg.lastIndex 属性重置为 0。

array = reg.exec(string);
console.log(array);//["Internet", "Internet", index: 6, input: "World Internet Conference"]
console.log(reg.lastIndex);//14


array = reg.exec(string);
console.log(array);//["Conference", "Conference", index: 15, input: "World Internet Conference"]
console.log(reg.lastIndex);//25


array = reg.exec(string);
console.log(array);//null
console.log(reg.lastIndex);//0

有的时候我们需要手动将 lastIndex 的值手动设置为 0,如下例子:

var reg = /[0-9]+/g,
   str1 = "123abc",
   str2 = "123456";
reg.exec(str1);
console.log(reg.lastIndex);//3
var array = reg.exec(str2);
console.log(array);//["456", index: 3, input: "123456"]

以上代码,正则式在匹配字符串 str2 时,期望的正确结果应该是“123456”,因此建议在第二次执行 exec 方法前,增加一句 reg.lastIndex = 0;

String

match,search,replace,split 方法请参考字符串API。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值