正则常见函数

正则表达式常用的方法分为 2 类:

  1. 字符串上调用,进行正则规则匹配。操作对象是正则表达式
  2. 正则表达式上调用。操作对象是字符串。

准备了下面代码:

const pattern = /runoob/gi; // 正则表达式
const str = "Visit Runoob!runoob"; // 待匹配字符串
1
2

字符串上调用的方法,常见的有:search/ match / replace

// Return: Number 代表搜索到的开始地址
console.log(str.search(/Runoob/i));

// Return: Array 匹配出来的所有字符串
console.log(str.match(/run/gi));

// Return: 新的string对象
console.log(str.replace(/visit/i, "visit"));
1
2
3
4
5
6
7
8

正则表达式对象上的方法,常见的有:test / exec

// Return: Boolean 代表是否符合匹配
console.log(pattern.test(str));

// Return: 找到第一个匹配的值,返回一个数组,存放着匹配信息
console.log(pattern.exec(str));
1
2
3
4
5

实现千分位标注

题目:实现千分位标注位,考虑小数、负数和整数三种情况。

sep参数是自定义的分隔符,默认是,

/**
 * 实现千分位标注位
 * @param {*} str 待标注的字符串
 * @param {*} sep 标注符号
 */
const addSeparator = (str = "", sep = ",") => {
  str += "";
  const arr = str.split("."),
    re = /(\d+)(\d{3})/;

  let integer = arr[0],
    decimal = arr.length <= 1 ? "" : `.${arr[1]}`;

  while (re.test(integer)) {
    integer = integer.replace(re, "$1" + sep + "$2");
  }

  return integer + decimal;
};

console.log(addSeparator(-10000.23)); // -10,000.23
console.log(addSeparator(100)); // 100
console.log(addSeparator(1234, ";")); // 1;234
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

全局匹配与lastIndex

题目:请说出下面代码执行结果(为了方便,我将结果注释在代码中了),并且解释。

const str = "google";
const re = /o/g;
console.log(re.test(str)); // true
console.log(re.test(str)); // true
console.log(re.test(str)); // false
1
2
3
4
5

由于使用的是全局匹配,因此会多出来lastIndex这个属性,打印如下:

const str = "google";
const re = /o/g;

console.log(re.test(str), re.lastIndex); // true 2
console.log(re.test(str), re.lastIndex); // true 3
console.log(re.test(str), re.lastIndex); // false 0
1
2
3
4
5
6

简单理解就是:同一个全局匹配的正则对同一个目标串匹配后,匹配过的部分串将不再匹配。

字符串第一个出现一次的字符

题目:字符串中第一个出现一次的字符

利用字符串的match方法匹配指定字符:

const find_ch = str => {
  for (let ch of str) {
    const re = new RegExp(ch, "g");
    // 检查每个字符的匹配数量
    if (str.match(re).length === 1) {
      return ch;
    }
  }
};
// 输出答案是 l
console.log(find_ch("google"));
1
2
3
4
5
6
7
8
9
10
11

除了上述方法,使用indexOf/lastIndexOf同样可以:

const find_ch = str => {
  for (let ch of str) {
    if (str.indexOf(ch) === str.lastIndexOf(ch)) {
      return ch;
    }
  }
};
// 输出答案是 l
console.log(find_ch("google"));
1
2
3
4
5
6
7
8
9