Skip to content
文档章节

正则

特殊用法

反向引用

反向引用只能用来引用括号里面的子表达式

\1 表示第一个子表达式 \2 表示第二个子表达式

特殊的 \0 匹配整个表达式

js
<Hh([1-6])>.*?<\/[Hh]\1>

匹配 h1~h6 标签,上面可以匹配 <h1>foo</h1> 而不匹配 <h1>sdfasf</h2>

上面([1-6]) 是第一个表达式, 而 \1匹配第一个子表达式

.*? 是栏匹配用法。

替换

有如下示例

js
const reg1 = /(\w+[\w\.]*@[\w\.]+\.\w+)/i;

const repStr = `<a href="mailto:$1">$1</a>`;

const str1 = 'Hello, zunkun@liuzunkun.com, this is my email';

const str2 = str1.replace(reg1, repStr);

console.log({ str1, str2 });

// str1: 'Hello, zunkun@liuzunkun.com, this is my email',
// str2: 'Hello, <a href="mailto:zunkun@liuzunkun.com">zunkun@liuzunkun.com</a>, this is my email'

上面的示例 $1 替换第一个引用第一个子表达式执行替换操作

下面的替换更能看到 $ 符号在字符替换上的用处

js
const reg = /(\d{3})(-)(\d{3})(-)(\d{4})/i;

const str1 = '313-555-1234';

const repStr = '($1)---$3---$5';

const str2 = str1.replace(reg, repStr);

console.log('str1: ', str1);
console.log('str2: ', str2);

// str1:  313-555-1234
// str2:  (313)---555---1234

向前查看 ?= 用法

?= 向前查看,匹配 ?= 后面的正则规则,但是不消耗后面的规则,

对于 https://baidu.com

.+(😃: 匹配 https:, 此处消耗 : 符号

.+(?=:) 匹配 https 而不消耗 : 符号

js
const reg = /.*(?=<\/h1)/;
const str1 = `
<h1>test page </h1>
<p>this is a p line </p>
<h3>sdafasfa<h3>
<h4>sdafasfa<h4>
<h3>sdafasfa<h3>
`;

console.log('str1: ', str1);

const exec = reg.exec(str1);

console.log(exec);

常用正则匹配

邮箱

js
/(\w+-*\.)*\w+@(\w+-*\w+\.)+[a-zA-Z]/;

IP 地址

js
((25[0-5])|(2[0-4]\d)|(1\d{2})(\d{1,2})\.){3}((25[0-5])|(2[0-4]\d)|(1\d{2})(\d{1,2})\.)

URL

jsx
/^https?:\/\/[\w.-]+(:\d*)?(\/([\w\/-]*(\?\S+)?)?)?/;

日期

js
(19|20)\d{2}-((0?[1-9])|(10|11|12))-((0?\d)|([12]\d)|(3[01]))

参考

正则表达式正向匹配与反向匹配