Catalyst

JS 笔记:正则表达式相关

正则非常常用,不过 search/match/reg.exec 连着来就有点忘记谁是谁了(尤其是加上 group 的匹配替换)

String

返回子串起始位置,未找到则返回-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);
}