3 - 正向预查、贪婪与非贪婪模式、replace方法

559 阅读2分钟

知识点:

1. 正向预查

  • 正向预查(?=n)
  • 正向负预查:(?!)

2. 贪婪与非贪婪模式

  1. 贪婪模式
  • 原则:能匹配多个,绝不匹配少个;
  • 贪婪模式的量词:“{m,n}、“{m,}”、“?”、“*”和“+”
  1. 非贪婪模式
  • 原则:能匹配少个,绝不匹配多个;
  • 非贪婪模式的量词(匹配优先量词后加上“?”):“{m,n}?”、“{m,}?”、“??”、“*?”和“+?”

3. replace方法

  1. replace本身没有全局匹配的能力;

一、正向预查

1. 正向预查(?=n)

var str = '1231231231',
    reg = /1(?=2)/g; //匹配后面紧跟2的1
console.log(str.match(reg)); //["1", "1", "1"]

2. 正向负预查:(?!)

var str = '1231231231',
    reg = /1(?!2)/g; //匹配后面不跟2的1
console.log(str.match(reg)); //["1"]

二、贪婪与非贪婪模式

  1. 贪婪模式
  • 原则:能匹配多个,绝不匹配少个;
  • 贪婪模式的量词:“{m,n}、“{m,}”、“?”、“*”和“+”
  1. 非贪婪模式
  • 原则:能匹配少个,绝不匹配多个;
  • 非贪婪模式的量词(匹配优先量词后加上“?”):“{m,n}?”、“{m,}?”、“??”、“*?”和“+?”
var str = 'abcd{{efg}}abcd{{xyz}}',
    reg = /{{.*?}}/g;
console.log(str.match(reg)); // ["{{efg}}", "{{xyz}}"]

var str = 'bbbbbb',
    reg = /\w??/g; // \w?->出现0-1次的字母,w??->出现0-1次的字母,非贪婪模式(匹配出现0次)
console.log(str.match(reg)); //["", "", "", "", "", "", ""]

三、replace方法

1. replace本身没有全局匹配的能力

var str = 'JSplusplus';
var str1 = str.replace('plus', '+');
console.log(str1); //JS+plus

2. xxyy -> yyxx

var str = 'aabbccdd',
    reg = /(\w)\1(\w)\2/g;
console.log(str.match(reg));
var str1 = str.replace(reg, '$2$2$1$1');
console.log(str1); //bbaaddcc
//$:当前匹配出来的字符串;$1:第一个子表达式;$2:第2个子表达式
var str = 'aabbccdd',
    reg = /(\w)\1(\w)\2/g;
var str2 = str.replace(reg, function ($, $1, $2) {
  console.log($, $1, $2); // aabb a b   ccdd c d
  return $2 + $2 + $1 + $1;
});
console.log(str2); //bbaaddcc

3. 将js-plus-plus变成jsPlusPlus

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

4. 将jsPlusPlus变成js_plus_plus

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

5. xxyyzz -> XxYyZz

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

6. 将aabbcc变成aab$c,不能使用function(){}

var str = 'aabbcc',
    reg = /(\w)\1(\w)\2(\w)\3/g;
var str2 = str.replace(reg, '$1$$$2$$$3$$');
console.log(str2); //$a$b$c

7. \:转义字符

var str = 'aa?bb+cc',
    reg = /\?|\+/g;
var str2 = str.replace(reg, '');
console.log(str2); //aabbcc

8. *

var str = 'aaaaabbccccccc',
    reg = /(\w)\1*/g;
var str2 = str.replace(reg, '$1');
console.log(str2); //abc

9. 数值每三位加逗号

var str = '10000000000000',
    reg = /(?=(\B)(\d{3})+$)/g; // \B:匹配非单词边界,即匹配空格
var str2 = str.replace(reg, ',');
console.log(str2); // 10,000,000,000,000

10. 将字符串变成四位大写字母-的方式连接起来

var str = 'fdlhgsduiklkljajhjkqwdd',
    reg = /(?=(\B)(\w{4})+$)/g;
var str2 = str.replace(reg, '-').toUpperCase(); //FDL-HGSD-UIKL-KLJA-JHJK-QWDD
console.log(str2);

11. 双大括号替换值{{}}

var str = 'My name is {{name}}.I\'m {{age}} years old.',
    reg = /{{(.*?)}}/g;
/**
 * $:当前匹配出来的字符串;
 * $1:第一个子表达式;
 * 
 */
var str2 = str.replace(reg, function (node, key) {
  return {
    name: 'may',
    age: '18岁'
  } [key];

  // let obj = {
  //     name: 'may',
  //     age: '18岁'
  // }
  // return obj[key];
})
console.log(str2); //My name is may.I'm 18岁 years old.