正则非常常用,不过 search/match/reg.exec 连着来就有点忘记谁是谁了(尤其是加上 group 的匹配替换)
String
Search
返回子串起始位置,未找到则返回-1
let reg = /world/g;
var str = "Hello world";
var n = str.search(reg);
console.log(n);
输出 6
Match
检索指定的值。
let reg = /w\S+d/g;
var str = "Hello world";
var n = str.match(reg);
console.log(n);
输出:["world"]
let reg = /w\S+d/g;
var str = "Hello world world";
var n = str.match(reg);
console.log(n);
输出 ["world", "world"]
Replace
replace 默认只替换第一个匹配,如果使用带全局的正则则全匹配:
let reg = /w\S+d/g;
var str = "Hello world world";
var n = str.replace(reg, "JavaScript");
console.log(n);
输出 Hello JavaScript JavaScript
,两个都被替换了。
另有replaceAll
默认全匹配,如果使用不带全局的正则则会报错。
子句匹配:
let reg = /worl(\S+)/g;
var str = "Hello world world";
var n = str.replaceAll(reg, "$1");
console.log(n);
输出 Hello d d
RegExp
RegExp 对象
var pattern = /world/i;
Exec
let reg = /world/g;
var str = "Hello world";
var n = reg.exec(str);
console.log(n);
输出 ["world"]
命名子串:
let reg = /(?<year>\d{4})-(?<month>\d{2})/g;
var str = "2021-07";
var n = reg.exec(str);
打印n
为:["2021-07", "2021", "07"]
n 的 object 为:
Array(3) [ "2021-07", "2021", "07" ]
0: "2021-07"
1: "2021"
2: "07"
groups: Object { year: "2021", month: "07" }
index: 0
input: "2021-07"
length: 3
<prototype>: Array []
常见使用场景:循环匹配提取。
const str = "1.apple 2.banana 3.orange";
const reg = /(?<number>\d)\.(?<text>\S+)/g; // 像这样在 while 里使用的话,不要掉了全局标志!(否则无限循环
while ((m = reg.exec(str))) {
console.log(m.groups.text);
}