正向预查

  1. var str = '1231231231',
  2. reg = /1(?=2)/g;
  3. console.log(str.match(reg));//['1', '1', '1']

要匹配一个字符串,但是有条件的,条件是什么,这个字符串后面要指定一个特定的字符或者字符串,这种匹配方式叫做正向预查的匹配方式
思路:在字符串后面加条件,条件用()括起来

  1. var str = '1231231231',
  2. reg = /1(?!2)/g;//['1']
  3. console.log(str.match(reg));

正向预查两种情况
1后面带有=
2后面不带有!

贪婪模式与非贪婪模式

  1. var str = 'abcd{{efg}}abcd{{xyz}}',
  2. reg = /{{.*}}/g;
  3. console.log(str.match(reg));//['{{efg}}abcd{{xyz}}']

想取两个带有{{}}的字符串,但由于贪婪模式,能取最长的字符串就取最长的字符串
贪婪模式:能匹配多就不匹配少,能多匹配就多匹配
非贪婪模式:能匹配少就不匹配多,能少匹配就少匹配
默认是贪婪模式,需要把贪婪模式变成非贪婪模式,在贪婪模式后面加?

  1. var str = 'abcd{{efg}}abcd{{xyz}}',
  2. reg = /{{.*?}}/g;
  3. console.log(str.match(reg));//['{{efg}}', '{{xyz}}']

单独写?就是0-1,*?组合就是非贪婪

  1. var str='aaaaaa',
  2. reg=/\w?/g;
  3. console.log(str.match(reg));//['a', 'a', 'a', 'a', 'a', 'a', '']

w?匹配0-1的,因为贪婪模式会匹配1,,不会匹配0,所以匹配a,最后都匹配完成了匹配0,’’

  1. var str = 'bbbbbb',
  2. reg = /\w??/g;
  3. console.log(str.match(reg));//['', '', '', '', '', '', '']

??变成了非贪婪模式,能匹配少就不匹配多,把每个地方的空都匹配了,bb之间有空,把多的过滤掉了

replace

这个方法很重要

不具备全局匹配能力

  1. var str='JSplusplus';
  2. var str1= str.replace('plus','+');
  3. console.log(str1);//JS+plus
  1. var str='JSplusplus',
  2. reg=/plus/;
  3. var str1= str.replace(reg,'+');
  4. console.log(str1);//JS+plus
  1. var str='JSplusplus',
  2. reg=/plus/g;
  3. var str1= str.replace(reg,'+');
  4. console.log(str1);//JS++

xxyy->yyxx

image.png

  1. var str='aabbccdd',
  2. reg=/1/g;
  3. str.replace(reg,'')//bbaaddcc
  1. var str = 'aabbccdd',
  2. reg = /(\w)\1(\w)\2/g;
  3. console.log(str.match(reg));//['aabb', 'ccdd']
  4. str.replace(reg, '')//bbaaddcc
  1. var str = 'aabbccdd',
  2. reg = /(\w)\1(\w)\2/g;
  3. console.log(str.match(reg));//['aabb', 'ccdd']
  4. var str1= str.replace(reg, '$2$2$1$1')//bbaaddcc
  5. console.log(str1);

$2与(\w)\2对应,两遍$2,之后两遍$1
用$可以拿出子表达式的引用的字符串,拿出reg引用的字符串,筛选的字符串

  1. var str = 'aabbccdd',
  2. reg = /(\w)\1(\w)\2/g;
  3. console.log(str.match(reg));//['aabb', 'ccdd']
  4. var str1= str.replace(reg, function ($,$1,$2) {
  5. console.log($,$1,$2);
  6. })

image.png
$是str中被匹配的字符串,$1是第一个子表达式,即(\w)\1,$2是第一个字表达式,即(\w)\2,不对,$1是第一个(\w),$2是第二个(\w),与1、2没有关系

可以任意起名字,不叫$1也行

  1. var str = 'aabbccdd',
  2. reg = /(\w)\1(\w)\2/g;
  3. // console.log(str.match(reg));//['aabb', 'ccdd']
  4. var str1= str.replace(reg, function ($,$1,$2) {
  5. // console.log($,$1,$2);
  6. // return $2$2$1$1//错误 未声明变量
  7. // return "$2$2$1$1"//$2$2$1$1$2$2$1$1
  8. return $2+$2+$1+$1//bbaaddcc
  9. })
  10. console.log(str1);

要勇于回答,勇于踩坑,勇于犯错

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

image.png
$1提取子表达式,-\没有括号不是子表达式

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

image.png

  1. //jsPlusPlus->js_plus_plus
  2. var str = 'jsPlusPlus',
  3. reg = /([A-Z])/g;
  4. var str1 = str.replace(reg, function ($, $1) {
  5. console.log($, $1)//P P
  6. return '_'+$1.toLowerCase();
  7. });
  8. console.log(str1);//js_plus_plus

正则7.5个小时,

xxyyzz->XxYyZz

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

多少子表达式都可以

aabbcc =>a$b$c 不能使用function

  1. var str = 'aabbcc',
  2. reg=/(\w)\1(\w)\2(\w)\3/g;
  3. // var str1=str.replace(reg,'$1$$2$$3$');//a$2$3$
  4. var str1=str.replace(reg,'$1$$$2$$$3$$');//a$b$c$ 写两个$$符合,代表一个$
  5. // var str1=str.replace(reg,'$1*$2*$$3');//a*b*$3,*可以直接加
  6. console.log(str1);
  1. var str = 'aa\\bb\\cc',
  2. reg = /\\/g;
  3. console.log(str.match(reg));//['\\', '\\']

image.png

  1. var str = 'aa?bb?cc',
  2. reg = /\?/g;
  3. console.log(str.match(reg));//['?', '?']

?代表0-1,在正则中,需要转义

  1. var str = 'aa*bb*cc',
  2. reg = /\*/g;
  3. console.log(str.match(reg));//['*', '*']

正则表达式语法里面有的符号,想要匹配他们,需要转义

  1. var str = 'aa?bb+cc',
  2. reg = /\?|\+/g;
  3. console.log(str.match(reg));//['?', '+']
  1. var str = 'aaaaabbbccccccccc',
  2. reg = /(\w)\1*/g;
  3. console.log(str.match(reg));//['aaaaa', 'bbb', 'ccccccccc']
  4. var str1=str.replace(reg,'$1');
  5. console.log(str1);//abc
  1. var str = '100000000000';
  2. // var str1 = str.replace(/(\d{3})/g, '$1,');//100,000,000,000,
  3. var str1 = str.replace(/(\d{3}\B)/g, '$1,');//100,000,000,000 B非单词边界
  4. console.log(str1);//abc

这样写不行,这是不行的如果多出来一个0
image.png

  1. var str = '1000000000000';
  2. var str1 = str.replace(/(\d{3}\B)/g, '$1,');
  3. console.log(str1);//100,000,000,000,0
  1. var str = '1000000000000',
  2. reg = /(?=(\B)(\d{3})+$)/g;
  3. console.log(str.replace(reg, ','));//1,000,000,000,000

每次匹配都是1个空,为主体,再加三个0
(\d{3})+$)每三个数字算一个,以三个数字为结尾
/1(?=2)/应该这样写,不写1,写成/(?=2)/就是空
每次结尾都是以一个空+三个零000为结尾,取每三个000前面的那个空,把那个空替换成

  1. var str = 'abcdefghijklmnopqrstuvwxyz',
  2. reg = /(?=(\B)(\w{4})+$)/g;
  3. console.log(str.replace(reg, '-'));//ab-cdef-ghij-klmn-opqr-stuv-wxyz

最佳方案

模板替换

可以查到{{}}中间字符

  1. var str='My name is {{name}}.I\'m {{age}} years old.',
  2. reg=/{{.*?}}/g;
  3. console.log(str.match(reg));

image.png

  1. var str = 'My name is {{name}}.I\'m {{age}} years old.',
  2. reg = /{{(.*?)}}/g;
  3. console.log(str.match(reg));
  4. /* var str1=str.replace(reg,function ($,$1) {
  5. console.log($,$1);
  6. })*/
  7. var str1 = str.replace(reg, function (node, key) {
  8. console.log(node, key);
  9. })
  10. console.log(str1);

image.png
这样写替换模板字符,替换{{}}中的文字

  1. var str = 'My name is {{name}}.I\'m {{age}} years old.',
  2. reg = /{{(.*?)}}/g;
  3. // console.log(str.match(reg));
  4. /* var str1=str.replace(reg,function ($,$1) {
  5. console.log($,$1);
  6. })*/
  7. var str1 = str.replace(reg, function (node, key) {
  8. return {
  9. name: 'Jone',
  10. age: 32
  11. }[key]
  12. })
  13. console.log(str1);//My name is Jone.I'm 32 years old.
  1. var str = 'My name is {{name}}.I\'m {{age}} years old.',
  2. reg = /{{(.*?)}}/g;
  3. var str1 = str.replace(reg, function (node, key) {
  4. var obj= {
  5. name: 'Jone',
  6. age: 32
  7. }
  8. console.log(obj[key]);
  9. });
  10. console.log(str1);

image.png

  1. var str = 'My name is {{name}}.I\'m {{age}} years old.',
  2. reg = /{{(.*?)}}/g;
  3. var str1 = str.replace(reg, function (node, key) {
  4. var obj= {
  5. name: 'Jone',
  6. age: 32
  7. }[key]
  8. console.log(obj[key]);
  9. return obj;
  10. });
  11. console.log(str1);

image.png

  1. var str = 'My name is {{name}}.I\'m {{age}} years old.',
  2. reg = /{{(.*?)}}/g;
  3. var str1 = str.replace(reg, function (node, key) {
  4. /* var obj= {
  5. name: 'Jone',
  6. age: 32
  7. }[key]
  8. console.log(obj[key]);
  9. return obj;*/
  10. return {
  11. name: 'Jone',
  12. age: 32
  13. }[key]
  14. });
  15. console.log(str1);//My name is Jone.I'm 32 years old.

其实就是这样写

  1. var str = 'My name is {{name}}.I\'m {{age}} years old.',
  2. reg = /{{(.*?)}}/g;
  3. var str1 = str.replace(reg, function (node, key) {
  4. var obj = {
  5. name: 'Jone',
  6. age: 32
  7. }
  8. console.log(obj);
  9. console.log(obj[key]);
  10. return obj[key];
  11. });
  12. console.log(str1);

image.png

  1. <div class="artical"></div>
  2. <script type="text/html" id="tpl">
  3. <div class="wrap">
  4. <h1>{{title}}</h1>
  5. <h3>{{author}}</h3>
  6. <p>{{content}}</p>
  7. </div>
  8. </script>
  9. <script !src="">
  10. var tpl=document.getElementById('tpl').innerHTML,
  11. oArtical=document.getElementsByClassName('artical')[0];
  12. console.log(tpl);
  13. var reg = /{{(.*?)}}/g;
  14. var str1 = tpl.replace(reg, function (node, key) {
  15. return{
  16. title :'这是一个模板替换的测试',
  17. author:'enjoy',
  18. content : '这是我要做的一个模板替换的测试,它是一个非常重要的知识点。'
  19. }[key]
  20. });
  21. console.log(str1);
  22. oArtical.innerHTML=str1;
  23. </script>

image.png

image.png

反复的去看,正则好理解,但需要反复看,反复练习,才能掌握
理解与掌握是两个关系。掌握在理解之上,在理解的基础上才能谈掌握,但也得去练习