正则表达式常用的方法分为 2 类:
准备了下面代码:
const pattern = /runoob/gi; // 正则表达式const str = "Visit Runoob!runoob"; // 待匹配字符串
① 字符串上调用的方法,常见的有: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"));
② 正则表达式对象上的方法,常见的有:test
/ exec
// Return: Boolean 代表是否符合匹配console.log(pattern.test(str));// Return: 找到第一个匹配的值,返回一个数组,存放着匹配信息console.log(pattern.exec(str));
题目:实现千分位标注位,考虑小数、负数和整数三种情况。
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.23console.log(addSeparator(100)); // 100console.log(addSeparator(1234, ";")); // 1;234
lastIndex
题目:请说出下面代码执行结果(为了方便,我将结果注释在代码中了),并且解释。
const str = "google";const re = /o/g;console.log(re.test(str)); // trueconsole.log(re.test(str)); // trueconsole.log(re.test(str)); // false
由于使用的是全局匹配,因此会多出来lastIndex
这个属性,打印如下:
const str = "google";const re = /o/g;console.log(re.test(str), re.lastIndex); // true 2console.log(re.test(str), re.lastIndex); // true 3console.log(re.test(str), re.lastIndex); // false 0
简单理解就是:同一个全局匹配的正则对同一个目标串匹配后,匹配过的部分串将不再匹配。
题目:字符串中第一个出现一次的字符
利用字符串的match
方法匹配指定字符:
const find_ch = str => {for (let ch of str) {const re = new RegExp(ch, "g");// 检查每个字符的匹配数量if (str.match(re).length === 1) {return ch;}}};// 输出答案是 lconsole.log(find_ch("google"));
除了上述方法,使用indexOf/lastIndexOf
同样可以:
const find_ch = str => {for (let ch of str) {if (str.indexOf(ch) === str.lastIndexOf(ch)) {return ch;}}};// 输出答案是 lconsole.log(find_ch("google"));