正则表达式( 形容词、转义符号、补充)

形容词

var str = "hunasheng";
      var reg = /n/;
      console.log(str.match(reg));

在这里插入图片描述
结果是在索引2的位置上匹配到了n

那么我向让他在最后的位置匹配到了n,那个怎么办??

先要匹配到最后的n,那么你要定义一个规则,并且这个规则能在最后匹配到n,那么要形容修饰一下n

 var str = "hunashengn";
      var reg = /n$/;
      console.log(str.match(reg));

在这里插入图片描述
匹配出来了一个n,这个n所在的位置是索引9,在索引9的位置上匹配到了n

那么这么在开头匹配到一个n,那个怎么办

 var str = "nashengn";
      var reg = /^n/;
      console.log(str.match(reg));

在这里插入图片描述
匹配出来了一个n,这个n所在的位置是索引0,在索引0的位置上匹配到了n

注意:形容词的^符号和表单式中的^符号是不一样的

  • 在表达是中^符号是除了后面的字符集合中的其他字符,是除了的意思
  • 形容词的^符号表示是形容是修饰的作用

其实这个形容词的作用,可能是判断是不是以某一个字符开头的

var str = "huasheng";
      var reg = /^h/;
      if (reg.test(str)) {
      	 console.log('true');
      }else {
      	console.log('false')
      };

如果字符串中第一个字符是h那就走If,不是则是else

我要匹配字符e,这个字符e是字符n后面的字符e,那个怎么办???

var str = "huasheng";
      var reg = /e(?=n)/;//(?=n)表示后面字符紧跟着的n,这是一个形容词,我要形容e
      //那么就是e(?=n)
      console.log(str.match(reg));

表示后面紧跟着字符ne
在这里插入图片描述
那么,后面没有紧跟着字符a的字符h呢那该怎么办??

var str = "uahehnag";
      var reg = /h(?!a)/;
      console.log(str.match(reg));

在这里插入图片描述
(?<=n)x 匹配到前面紧跟着字符n的x

var str = "uanxhnag";
      var reg = /(?<=n)x/;//也可以写多个
      console.log(str.match(reg));

在这里插入图片描述
(?<!n)x 匹配到前面没有紧跟着字符n的x

 var str = "uxnanxhnag";
      var reg = /(?<!n)x/;
      console.log(str.match(reg));

在这里插入图片描述
总结

形容词:修饰字符n (也叫断言)

  • n$ 匹配到在结尾位置的字符n
  • ^n 匹配到在开头位置的字符n
  • x(?=n) 匹配到后面紧跟着字符nx
  • x(?!n) 匹配到后面没有紧跟着字符nx
  • (?<=n)x 匹配到前面紧跟着字符nx
  • (?<!n)x 匹配到前面没有紧跟着字符nx

那像语文哪种叠词的形式该怎么匹配

var str = "aaddcc";
      var tag = /[a-z]{2}/;
      console.log(str.match(tag));

在这里插入图片描述
如果用这种写法,那么aa会被取出来,那么把字符串换成abbbcc呢,那会把ab提取出来而不是aa那么我们该怎么办

那么我该怎么把叠词匹配出来呢??

var str = "adddcc";
      var tag = /(\w)\1/;
      console.log(str.match(tag));

\1表示你匹配到的一个数据的复制品,\w你匹配到了d,那么\1是你匹配到d的复制品,说白了\1是一个d,所以当前你需要匹配两个字符是dd,那会符号条件的dd就会匹配出来。

可以理解为,你匹配到了什么东西,那么\1就是你匹配到的那个东西的复制品

那么全局匹配呢

var str = "daddacc";
      var tag = /(\w)\1/g;
      console.log(str.match(tag));

第一次(\w)条件匹配了d那么他会继续往下走,走到\1那么就是\w的复制品就是d,那么就是dd了完成一次匹配,就走到了g表示全局匹配,看看全局中有没有符合的(w)\1的条件如果有就拿着(w)\1走全局匹配,如果没有就不匹配 。
在这里插入图片描述
那么怎么匹配"aabbcc"的字符串方式该怎么办??

var str = "daabbccfscs";
      var tag = /(\w)\1(\w)\2(\w)\3/;
      console.log(str.match(tag));

在这里插入图片描述
\w是第一个字符a \1\w的复制品也是字符a\w是第二个字符b,那么\2表示第二个字符的复制品是字符b也是第二个复制品

\1 \2 \3 反向引用 表示匹配出的值的复制品(必须是\1 \2 \3的形式的)

补充字符串方法str.replace()替换字符串方法 (用后面的字符串,替换前面的字符串)

var str = "花生花生";
       console.log(str.replace("花生","huasheng"));

在这里插入图片描述
现在字符串中的replace他没有换完,他只换了第一个花生没有换了第二个花生,其实replace第一个参数可以传正则表达式如:

var str = "花生花生";
       console.log(str.replace(/花生/,"huasheng"));

在这里插入图片描述
其实这个字符串他没有替换完,那该怎么办?

var str = "花生花生";
       console.log(str.replace(/花生/g,"huasheng"));

第一次正则匹配到了花生,但是没有写全局匹配他没有往下匹配花生,这时我们需要写一个全局匹配即可,一旦写成全局匹配就替换所有。
在这里插入图片描述

练习题目

var str = 'get-element-by-id'; // getElementById
    var reg = /-[a-z]/g;
    var newStr = str.replace(reg,function(){
        return arguments[0][1].toUpperCase()
    });
    console.log(newStr);

那么如何把aabbcc 这种形式的变成 ccbbaa这种形式的

 var str = "aabbcc";
       var reg = /(\w)\1(\w)\2(\w)\3/;
       console.log(str.match(reg)[0]);

在这里插入图片描述
这是形式虽然是可以匹配到叠词的形式,但是不能匹配到颠倒过来的叠词形式

那该怎么办???

不能匹配那咱们就用replace方法替换

var str = "aabbcc";
       var reg = /(\w)\1(\w)\2(\w)\3/;
       str.replace(reg,function(){
           console.log(arguments);
       });

在这里插入图片描述
arguments他也是个数组,索引0的地方是你要匹配的数据,那为什么索引0的后面有"a" ,"b" , "c"呢??

因为,\w可以匹配出来a的,第二个\w是可以匹配出来b的,第三个\w是可以匹配出来c的,这个"a" ,"b" , "c"是因为\w匹配出来a,b,c那么就把匹配出来的字符放置在索引0的后面

因为你给\w写的是(\w)这个在正则中叫做 子表达式 ,你给\w加上括号那么\w就是子表达式。

replace的第二个参数中回调函数中的argentina展示索引

0: "aabb" 符合正则规则的字符
1: "a" 第一个子表达式 只要加上括号就是子表达式(复合正则规则的后面是子表达式)
2: "b" 第二个子表达式
3: 0 在什么位置匹配到了符合正则规则的字符
4: "aabbcc" 原始字符

那么可以这样整

var str = "aabbcc";
       var reg = /(\w)\1(\w)\2(\w)\3/;
       str.replace(reg,function($,$1,$2,$3){
           return $3+$3+$2+$2+$1+$1
       });

在这里插入图片描述
上面的是一种方式,方法一(必须用$

方法二(必须用$

当前是有3个字表达式,第一个是a,第二个是b,第三个是c

 var str = "aabbcc";
       var reg = /(\w)\1(\w)\2(\w)\3/;
       str.replace(reg,'"$3""$3""$2""$2""$1""$1"');

replace函数,第二个参数你也可以自己用$$就是你的正则中的字表达式,当前$3表示第三个字表达是第三个字表达是匹配出来的是c第二个$3匹配出来的子表达式是c,那么以此类推。
那么结果就是ccbbaa
在这里插入图片描述
当你不写回调函数的时候,并且当你正则中是有字表达式的时候,$3表示第3个子表达式,$2表示第二个子表达式,$1是表示第三个子表达式。。。以此类推

$可以算是一个变量,表示的是字表达式中匹配出来的字符

补充 str.replace( 字符串1/正则字符串2/回调函数//"$1"/"$1"… ) 用字符串2替换字符串1

reg.exec(str)方法

var str = "huasheng";
       var reg = /h/g;
       console.log(str.match(reg))

在这里插入图片描述
这个match方法是一次都符合条件的字符都匹配出来了并且放在数组中

那么我想第一次符合条件的字符放置在数组中,然后再次匹配符合条件放置在数组中,那该怎么办

reg.lastIndex 记录下次要匹配的索引位置(可读可写) (默认是0)
reg.exec(str) 从索引lastIndex位置开始匹配符合正则规则的字符

       var str = "huasheng";
       var reg = /h/g;
       console.log(reg.exec(str))
       console.log(reg.lastIndex)
       console.log(reg.exec(str))
       console.log(reg.lastIndex)

在这里插入图片描述
第一次调用exec这个方法时,索引0的位置上匹配到了h,我把匹配好了的字符放置在数组中并且索引也给你记录一下,就是索引0的位置上匹配到了hlastIndex这个方法表示你下一次执行的时候索引的位置

在索引0匹配到了hlastIndex方法下一次匹配是从索引1开始匹配的,在索引4匹配到了hlastIndex方法下一次匹配是从索引5开始匹配的

没有匹配到是null那么lastIndex就会重新归位到索引0,从索引0开始匹配

那么reg.lastIndex这个属性也可以写

 var str = "huasheng";
       var reg = /h/g;
       console.log(reg.exec(str))
       console.log(reg.lastIndex = 4)
       console.log(reg.exec(str))
       console.log(reg.lastIndex)

在这里插入图片描述
修改了exec的下一次匹配的位置是索引4开始匹配的
在这里插入图片描述
在这里插入图片描述

转义符号

var str = "huash$eng";
       var reg = /$/;
       console.log(str.match(reg));

在这里插入图片描述
为什么?

因为$符合在正则中有特殊意义的,他是一个形容词他是能够修饰一个字符的,在结尾位置匹配的字符

那怎么让有特殊意义的字符没有特殊意义呢??

var str = "huash$eng";
       var reg = /\$/;
       console.log(str.match(reg));

在这里插入图片描述
在索引5匹配出来了$符合了

在正则中\是有特殊意义的,他的特殊意义就是把有特殊意义的字符转义掉

var str = "\\";
       console.log(str);

在这里插入图片描述就是自己转自己

想要匹配正则中有特殊意义的符号必须使用转移符号\ 必须把特殊意义转义掉

在这里插入图片描述
补充

用构造函数的形式定义正则表达式

var newReg = new RegExp(x,'gi');

new RegExp(x,'gi')是js内置的函数,第一个参数表示要匹配的字符,第二个参数表示修饰符。

那么通过构造函数创建的正则有什么好处呢??

			var y = "fkhsafh";//要匹配的字符串
			var x = 'f';//要匹配的字符
			var newReg = new RegExp(x,'gi');//定义正则
			console.log(x.match(newReg));

好处就是构造函数形式定义的正则里面的第一个参数是可以写变量的,而字面量形式是无法接受变量的

两则最大区别就是,构造函数定义的正则可以接收变量字面量形式定义的正则无法接收变量

在这里插入图片描述
补充

元字符\b(是border单词的首字母)

\b,他是一个形容词,形容一个字母处在单词边界的

var m = "cat";
			m.match(/\bc/)

在这里插入图片描述
作为单词边界的c在索引0的位置找到了

var m = "I hove cat";
			m.match(/\bc/)

在JS中被空格个开的,一段字母那么这个字母就是单词

在这里插入图片描述
作为单词边界的c在索引7的位置找到了(空格也算索引位置)
在这里插入图片描述
\n换行符和m换行匹配

var n = "huange\nhahus";
			var nstr = /h/gm;
			console.log(n.match(nstr));

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值