JS正则常用函数

1. 定义正则对象

JS有两种定义正则对象的方式,一种是构造函数方式,另一种是字面量方式。
- 1). 构造函数方式

var reg = new RegExp("[a-z]+", "gi");

这里,第一个参数是正则的内容,第二个参数是修饰符,修饰符通常有三种,i,g,m,i表示的含义是忽略大小写进行匹配,g表示全局匹配即匹配到第一个之后不停止继续匹配,m表示多行匹配即遇到换行后不停止匹配继续直到被匹配字符串结束。

  • 2). 字面量方式
var reg1 = /[a-z]+/gi;

两个斜杠之间的是定义的正则内容,最后一个斜杠之后的是修饰符,这种方式比第一种简单高效,所以通常使用第二种方式来定义正则。

2. 正则对象的方法

1). test()
- RegExp.test(string),该方法用来测试某个字符串是否与正则匹配,匹配就返回true,否则返回false。

  • 该方法接受一个字符串作为参数。
var reg = /[a-z]+/gi;
var content = "I'm learning Javascript";
var res = reg.test(content);
console.log(res); //匹配到返回:true

var reg = /[1-9]+/g;
var res = reg.test(content);
console.log(res); //未匹配到返回:false

2). compile()
- RegExp.compile(regexp,modifier),该方法的作用是能够对正则表达式进行编译,被编译过的正则在使用的时候效率会更高,适合于对一个正则多次调用的情况下,如果对一个正则只使用一两次,那么该方法没有特别显著的效应。

  • 接受的参数是一个正则。
var reg = /[a-z]+/gi;
var content = "I'm learning Javascript";
reg.compile(reg);
console.log(reg); // /[a-z]+/gi
var res = reg.test(content);
console.log(res); //true
  • compile() 方法也可用于改变和重新编译正则表达式。
reg.compile("[1-9]", "g");
console.log(reg); // 正则表达式被重新编译为/[1-9]/g
var res = reg.test(content);
console.log(res); //false

被编译的正则和没有编译的正则在测试结果上没有任何区别,只是多次调用的效率上会更高一些。

3). exec()
- RegExp.exec(string),该方法属于一个比较复杂的方法,它接受一个字符串,返回的是一个数组,数组中第0个元素是匹配的子字符串,第二个元素是正则中的第一个子分组匹配的结果(如果有子分组,即正则中存在用圆括号括起来的分组),第三个是正则中第二个子分组匹配的结果(如果有第二个子分组)…以此类推,如果没有正则子分组,那么该数组长度仅仅为1,就是匹配到的那个子字符串。同时,返回的这个数组同时还是一个对象,它拥有两个属性,分别为index表示当前匹配到的子字符串所处的位置,input属性表示被匹配的原始字符串。

  • 该方法中的正则对象如果不是全局匹配,即没有g修饰符,则每次调用只会从字符串开头处匹配第一个结果,且每次调用结果都是一样的。
var reg = /(\w)l(\w)/;
var content ="hello world!I'm Ayla.";
var res = reg.exec(content);
var i = 0;
while (res){
    if(i < 3) { //这里为了防止无限输出,只输出前3个结果
        console.log(res);
        console.log("lastIndex:" + reg.lastIndex); //每次调用的结果都一样,lastIndex没有发生变化。
        res = reg.exec(content);
        i++;
    }else{
        break;
    }
}
//下面是循环3次输出的结果,每次调用的结果都一样,lastIndex没有发生变化。
//["ell", "e", "l", index: 1, input: "hello world!I'm Ayla."] lastIndex:0
//["ell", "e", "l", index: 1, input: "hello world!I'm Ayla."] lastIndex:0
//["ell", "e", "l", index: 1, input: "hello world!I'm Ayla."] lastIndex:0
  • 只有指定为全局匹配,才能够按照从左往右依次去匹配,每次调用匹配一个结果,正则对象的lastIndex属性前进到本次匹配的末尾位置,下回再调用的时候,会从lastIndex处开始匹配而不是从头匹配。
var reg = /(\w)l(\w)/g;
var content ="hello world!I'm Ayla.";
var res = reg.exec(content);
while (res){
    console.log(res);
    console.log("lastIndex:" + reg.lastIndex);
    res = reg.exec(content);
}
//下面是输出的结果,可以看到正则对象的lastIndex属性改变了
//["ell", "e", "l", index: 1, input: "hello world!I'm Ayla."] lastIndex:4
//["rld", "r", "d", index: 8, input: "hello world!I'm Ayla."] lastIndex:11
//["yla", "y", "a", index: 17, input: "hello world!I'm Ayla."] lastIndex:20

3. String对象的正则方法

1). search()
- String.search(regexp),该方法是string对象的一个方法,用来查找第一次匹配的子字符串的位置,如果找到就返回一个number类型的index值,否则返回-1,它返回的只是第一次匹配的位置。

  • 它接受一个正则或者子字符串为参数,这里我们只讨论正则的情况。
var reg = /\wl\w/g;
var content = "I'm Ayla.hello world!";
var res = content.search(reg);
console.log(res); //它第一次匹配到'yla'在字符串的位置是5,所以返回值为:5

输出结果为5,可以看到尽管具有多个匹配结果而且也声明为全局匹配,但是还是返回的是第一个匹配到的子串的位置。

2). replace()
- String.replace(regexp/substr,replacement),该方法用来将字符串中的某些子串替换为需要的内容,接受两个参数,第一个参数可以为正则或者子字符串,表示匹配需要被替换的内容,第二个参数为被替换的新的子字符串。如果声明为全局匹配则会替换所有结果,否则只替换第一个匹配到的结果。

var reg = /hello/; //未声明为全局匹配,只替换第一个匹配到的结果
var content = "I'm Ayla.hello world!hello everybody!";
var res = content.replace(reg, "hi");
console.log(res); //I'm Ayla.hi world!hello everybody!
var reg = /hello/g; //声明为全局匹配则会替换所有结果
var content = "I'm Ayla.hello world!hello everybody!";
var res = content.replace(reg, "hi");
console.log(res); //I'm Ayla.hi world!hi everybody!
  • 该函数的第二个参数支持正则子表达式
var reg = /(\w)ello/g;
var content = "I'm Ayla.hello world!hello everybody!cello 123.";
var res = content.replace(reg, "$1i"); //这里的$1为字一个字表达式(/\w/)匹配到的内容,这里前两次$1的值为字符'h',最后一次$1的值为字符'c'
console.log(res); //I'm Ayla.hi world!hi everybody!ci 123.

3). split()
- String.split(separator,howmany),该方法主要用来将一个字符串拆分成一个数组,它接受一个正则或者子字符(串)作为参数,返回一个数组,简单情况下,我们不需要使用正则,只有在字符串拆分规则不统一的情况下才需要使用正则。

  • 第二个参数可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。
var reg = /\||\*|\s+/;
var content = "how|old*are    you";
var res = content.split(reg);
console.log(res); //["how", "old", "are", "you"]

var res = content.split(reg, 2); //这里设置了第二个参数
console.log(res); //["how", "old"] 由于设置了第二个参数,所以返回的结果数组的长度为2

4). match()
- String.match(regexp/searchvalue),该方法接受一个正则作为参数,用来匹配一个字符串,它的输出结果在不是全局匹配的情况下和exec方法的结果一致即一个数组并带有额外的属性,如果采用全局匹配,则不返回任何和其被匹配字符串相关的信息,只返回匹配的结果。

  • 非全局匹配
var reg = /(\w)l(\w)/;
var content = "I'm Ayla.hello world!";
var res = content.match(reg);
var i = 0;
while (res){
    if(i < 3) {
        console.log(res);
        console.log("lastIndex:" + reg.lastIndex);
        res = content.match(reg);
        i++;
    }else{
        break;
    }
}
//["ell", "e", "l", index: 1, input: "hello world!I'm Ayla."] lastIndex:0
//["ell", "e", "l", index: 1, input: "hello world!I'm Ayla."] lastIndex:0
//["ell", "e", "l", index: 1, input: "hello world!I'm Ayla."] lastIndex:0

非全局匹配下,结果和exec非全局匹配方法返回的完全一致。

  • 全局匹配
var reg = /(\w)l(\w)/g;
var content = "I'm Ayla.hello world!";
var res = content.match(reg);
console.log(res); //["yla", "ell", "rld"] 全局匹配下的时候它会一次性将所有匹配结果以数组形式返回

可以看到,在全局匹配下的时候,它不同于exec方法,它会一次性将所有匹配结果以数组形式返回,且这个数组没有其他属性用来指向被匹配字符串的信息,而exec方法在全局匹配下每次返回的依然是本次匹配的结果数组,且这个数组中只包含本次匹配信息,同时又拥有指向被匹配字符串的信息,即match方法在全局匹配下一次性返回了所有匹配结果,而exec在全局匹配下返回的依然是当次匹配结果。

  • 参数为字符串的情况
var reg = "hello";
var content = "I'm Ayla.hello world!hello everybody!";
var res = content.match(reg);
console.log(res); 
//["hello", index: 9, input: "I'm Ayla.hello world!hello everybody!"] 
//'hello'为匹配到的结果,index属性表示第一次匹配到子的字符串所处的位置,input属性表示被匹配的原始字符串。

该博客参考了js正则及常用方法函数总结这篇博客,并做了适当的修改及补充。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值