正向预查 贪婪与非贪婪模式 replace方法 非捕获分组

正向预查

匹配一个字符串但是 是有条件的 要求字符串后有一个特定的字符串或者没有特定字符串 就叫正向预查

      var str = '1231231231';
      var reg = /1(?=2)/g;

在这里插入图片描述

      var str = '1231231231';
      var reg = /1(?!2)/g;

在这里插入图片描述

贪婪模式和非贪婪模式

默认是贪婪模式 匹配符合要求最长的字符串

      var str = 'abcd{{efg}}abcd{{xyz}}';
      var reg = /{{.*}}/g;

在这里插入图片描述

取消贪婪模式 在后面加?

      var str = 'abcd{{efg}}abcd{{xyz}}';
      var reg = /{{.*?}}/g;

在这里插入图片描述
贪婪模式 匹配一次

      var str = 'aaaaaa';
      var reg = /\w?/g;

在这里插入图片描述
非贪婪模式 能匹配少就不匹配多

      var str = 'aaaaaa';
      var reg = /\w??/g;

在这里插入图片描述

replace

replace没有全局匹配的能力

      var str = 'JSplusplus';
      var str1 = str.replace('plus', '+');

在这里插入图片描述

      var str = 'JSplusplus';
      var reg = /plus/;
      var str1 = str.replace(reg, '+');

在这里插入图片描述

      var str = 'JSplusplus';
      var reg = /plus/g;
      var str1 = str.replace(reg, '+');

在这里插入图片描述xxyy -> yyxx
用$去拿子表达式中的引用的字符串

      var str = 'aabbccdd';
      var reg = /(\w)\1(\w)\2/g;
      var str1 = str.replace(reg, '$2$2$1$1');

在这里插入图片描述$ 当次被匹配的字符转 $1 第一个子表达式 $2第二个子表达式

      var str = 'aabbccdd';
      var reg = /(\w)\1(\w)\2/g;
      var str1 = str.replace(reg, function ($, $1, $2) {
        console.log($, $1, $2);
      });

在这里插入图片描述所以也可以这样写

      var str = 'aabbccdd';
      var reg = /(\w)\1(\w)\2/g;
      var str1 = str.replace(reg, function ($, $1, $2) {
        return $2 + $2 + $1 + $1;
      });

在这里插入图片描述
js-plus-plus -> jsPlusPlus
先看一下错误的写法
此时没有小括号 没有子表达式 所以$1就只是匹配的下标

      var str = 'js-plus-plus';
      var reg = /-\w/g;
      var str1 = str.replace(reg, function ($, $1) {
        console.log($, $1);
        return $1.toUpperCase();
      });

在这里插入图片描述
正确的写法

      var str = 'js-plus-plus';
      var reg = /-(\w)/g;
      var str1 = str.replace(reg, function ($, $1) {
        console.log($, $1);
        return $1.toUpperCase();
      });

在这里插入图片描述
jsPlusPlus -> js_plus_plus

      var str = 'jsPlusPlus';
      var reg = /([A-Z])/g;
      var str1 = str.replace(reg, function ($, $1) {
        return '_' + $1.toLowerCase();
      });

在这里插入图片描述
xxyyzz -> XxYyZz

      var str = 'xxyyzz';
      var reg = /(\w)\1(\w)\2(\w)\3/g;
      var str1 = str.replace(reg, function ($, $1, $2, $3) {
        return $1.toUpperCase() + $1 + $2.toUpperCase() + $2 + $3.toUpperCase() + $3;
      });

在这里插入图片描述
aabbcc -> a b b bc$ 不适用function
先看一下这种情况 除了$ 都可以直接加

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

在这里插入图片描述
对于 说需要写两个 说需要写两个 说需要写两个
或则和$ 转义也可以

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

在这里插入图片描述
匹配\ ? + * 都需要转义
语法中存在的符号都需要转义

      var str = 'aa?bb?cc';
      var reg = /\?/g;

在这里插入图片描述
aabbcc -> abc

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

在这里插入图片描述
但是这种方法对于aaaaaabbbcccccccc是无法去重的

需要这样做

      var str = 'aaaaaaaaaabbbbbbbbbcccccc';
      var reg = /(\w)\1*/g;
      var str1 = str.replace(reg, '$1');

在这里插入图片描述
1000000000 -> 100,00,000
空后面紧跟着非单词边界的三个数字为一组 至少有一组
如果匹配到就在前面加一个逗号

      var str = '10000000000';
      var reg = /(?=(\B)(\d{3})+$)/g;
      var str1 = str.replace(reg, ',');

在这里插入图片描述

双大括号替换值

      var str = "My name is {{name}}. I'm {{age}} years old";
      var reg = /{{(.*?)}}/g;
      var str1 = str.replace(reg, function (node, key) {
        console.log(node, key);
        return {
          name: 'Jone',
          age: 32,
        }[key];
      });

在这里插入图片描述

非捕获分组与一些常用正则案例

至少6位 包含一个大写 一个小写 一个数字 一个特殊
使用正向预查

reg = /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[~!?@#$%^&*].*$)/

匹配邮箱

      var reg = /^([A-z0-9_-])+\@([A-z0-9_\-\.]+\.([A-z]{2,4}))$/;

捕获分组

      var str = 'abcabc';
      var reg = /(a)(b)(c)/;
      console.log(str.match(reg));

在这里插入图片描述

不捕获分组 ?:

      var str = 'abcabc';
      var reg = /(?:a)(b)(c)/;
      console.log(str.match(reg));

在这里插入图片描述手机号校验

      var reg = /^(\(\+86\))?(13[0-9]|14[57]|15[012356789]|17[0678]|18[0-9])\d{8}$/;

日期校验
1990-12-01 1991/12/01 1991.12.01

      var reg = /^(19|20)\d\d([-/.])(0[1-9]|1[0-2])\2(0[1-9]|[12][0-9]|3[01])/;

十六进制的颜色

      var reg = /^#([A-Fa-f0-9]){6}|([A-Fa-f0-9]){3}/;

qq号

      var reg = /^[1-9][0-9]{4,9}/;

微信号

      var reg = /^[A-z]([A-z0-9_-]{5,19})+$/;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_聪明勇敢有力气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值