基础知识
选择符
|
这个符号带表选择修释符,也就是 |
左右两侧有一个匹配到就可以。
let tel = "010-12345678";
//错误结果:只匹配 | 左右两边任一结果
console.log(tel.match(/010|020\-\d{7,8}/));
//正确结果:所以需要放在原子组中使用
console.log(tel.match(/(010|020)\-\d{7,8}/));
字符转义
\ 这个符号带表选择修释符,也就是将 \ 右侧特殊字符转义 如/$^等
const url = "https://www.baidu.com";
console.log(/https:\/\//.test(url)); //true
边界符 | 说明 |
---|---|
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束,忽略换行符 |
原子字符
所有的原子字符:
元字符 | 说明 | 示例 |
---|---|---|
\d | 匹配任意一个数字 | [0-9] |
\D | 与除了数字以外的任何一个字符匹配 | [^0-9] |
\w | 与任意一个英文字母,数字或下划线匹配 | [a-zA-Z_] |
\W | 除了字母,数字或下划线外与任何字符匹配 | [^a-zA-Z_] |
\s | 任意一个空白字符匹配,如空格,制表符\t ,换行符\n | [\n\f\r\t\v] |
\S | 除了空白符外任意一个字符匹配 | [^\n\f\r\t\v] |
. | 匹配除换行符外的任意字符 |
匹配所有字符:
可以使用 [\s\S]
或 [\d\D]
来匹配所有字符
let yq = `
<span>
@#&^&*!
123
asda
</span>
`;
let res = yq .match(/<span>[\s\S]+<\/span>/);
console.log(res[0]);
模式修饰
修饰符 | 说明 |
---|---|
i | 不区分大小写字母的匹配 |
g | 全局搜索所有匹配内容 |
m | 视为多行 |
s | 视为单行忽略换行符,使用. 可以匹配所有字符 |
y | 从 regexp.lastIndex 开始匹配 |
u | 正确处理四个字符的 UTF-16 编码 |
lastIndex
RegExp对象lastIndex
属性可以返回或者设置正则表达式开始匹配的位置
- 必须结合
g
修饰符使用 - 对
exec
方法有效 - 匹配完成时,
lastIndex
会被重置为0
let yq = `1234561`;
let reg = /1/g;
reg.lastIndex = 1; //从索引1开始搜索
console.log(reg.exec(yq));
console.log(reg.lastIndex);
原子表
在一组字符中匹配某个元字符,在正则表达式中通过元字符表来完成,就是放到[]
(方括号)中,并且原子表中部分字符不需要转义,例如.就是小数点。
原子表 | 说明 |
---|---|
[] | 只匹配其中的一个原子 |
[^] | 只匹配"除了"其中字符的任意一个原子 |
[0-9] | 匹配0-9任何一个数字 |
[a-z] | 匹配小写a-z任何一个字母 |
[A-Z] | 匹配大写A-Z任何一个字母 |
可以使用 [\s\S]
或 [\d\D]
匹配到所有字符包括换行符
const reg = /[\s\S]+/g;
字母和数字必须为升序否则会报错
const num = "2";
console.log(/[3-0]/.test(num)); //SyntaxError
const yq = "asdasdasd";
console.log(/[f-a]/.test(yq)); //SyntaxError
原子组
基本使用
没有添加 g
模式修正符时只匹配到第一个,匹配到的信息包含以下数据
变量 | 说明 |
---|---|
0 | 匹配到的完整内容 |
1,2.... | 匹配到的原子组 |
index | 原字符串中的位置 |
input | 原字符串 |
groups | 命名分组 |
在match
中使用原子组匹配,会将每个组数据返回到结果中
- 0 为匹配到的完成内容
- 1/2 等 为原子级内容
- index 匹配的开始位置
- input 原始数据
- groups 组别名
let hd = "baidu.com";
console.log(hd.match(/bai(du)\.(com)/));
//["baidu.com", "du", "com", index: 0, input: "baidu.com", groups: undefined]
引用分租和分租别名
\n
在匹配时引用原子组,如果只希望组参与匹配,便不希望返回到结果中使用 (?:
处理((?:匹配字符)),如果希望返回的组数据更清晰,可以为原子组编号,结果将保存在返回的 groups
字段中,组别名使用 ?<>
形式定义,下面将标签替换为p
标签。
let yq = `
<h1>yq</h1>
<span>20</span>
<h2>180</h2>
`;
let reg = /<(?<tag>h[1-6])>(?<con>[\s\S]*)<\/\1>/gi;
console.log(yq.replace(reg, `<p>$<con></p>`));
重复匹配
如果要重复匹配一些内容时我们要使用重复匹配修饰符,包括以下几种。
符号 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
正则表达式在进行重复匹配时,默认是贪婪匹配模式,也就是说会尽量匹配更多内容,但是有的时候我们并不希望他匹配更多内容,这时可以通过?进行修饰来禁止重复匹配。
使用 | 说明 |
---|---|
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |
let str = "aaa";
console.log(str.match(/a+/)); //aaa
console.log(str.match(/a+?/)); //a
console.log(str.match(/a{2,3}?/)); //aa
console.log(str.match(/a{2,}?/)); //aa