JavaScript学习笔记—正则表达式
- 用来定义一个规则
- 通过这个规则计算机可以检查一个字符串是否符合规则或者将字符串中符合规则的内容提取出来
- 也是JS中的一个对象,所以要使用正则表达式,需要先创建正则表达式的对象
// 构造函数创建,参数1:正则表达式,参数2:匹配模式
let reg = new RegExp("a", "i");
// 字面量创建
reg = /a/i;
reg = /\w/;
reg = new RegExp("\\w");
// 检查一个字符串中是否有a
reg = new RegExp("a");
let str = "a";
let result = reg.test(str); // true
result = reg.test("b"); // false
result = reg.test("abc"); // true
result = reg.test("abcde"); // true
1. 在正则表达式中大部分字符都可以直接写
2. | 在正则表达式中表示或
3. [] 表示或(字符集)
- [a-z] 任意的小写字母
- [A-Z] 任意的大写字母
- [a-zA-Z] 任意的字母
- [0-9] 任意的数字
4. [^] 表示除了
- [^x] 除了x
5. . 表示除了换行意外的任意字符
6. 在正则表达式中使用\作为转义字符
7. 其他字符集
- \w 任意单词字符 [A-Za-z0-9_]
- \W 除了单词字符 [^A-Za-z0-9_]
- \d 任意数字 [0-9]
- \D 除了数字 [^0-9]
- \s 单个空白字符
- \S 除了单个空白字符
- \b 单词边界
- \B 除了单词边界
8. 开头和结尾
- ^ 表示字符串的开头
- $ 表示字符串的结尾
let re = /[a-z]/;
re = /[A-Z]/;
re = /[A-Za-z]/;
re = /[a-z]/i; // 匹配模式i表示忽略大小写
re = /[^a-z]/; // 匹配包含小写字母以外内容的字符串
re = /./;
re = /\./;
re = /\w/;
re = /^a/; // 匹配开始的位置a,如:abc, ade
re = /a$/; // 匹配结束的位置a,如:dca, dfga
re = /^a$/; // 只匹配a,完全匹配,要求字符串必须和正则完全一致
9. 量词:
- {m} 正好m个
- {m,} 至少m个
- {m,n} m-n个
- + 一个以上,相当于
{1,}
- * 任意数量
- ? 0-1个,相当于
{0,1}
let re = /a{3}/; // aaa, aaabdm, aaaa 都返回true
re = /^a{3}$/; // 必须aaa才返回true, 其它都返回false
re = /^(ab){3}$/; // 必须ababab才返回true, 其它都返回false
re = /^[a-z]{3}$/; // 随意3个字母返回true, 其它都返回false
re = /^[a-z]{1,}$/; // 至少1个字母返回true, 没有字母返回false
re = /^[a-z]{1,3}$/; // 1到3个字母返回true, 否则返回false
re = /^ba+$/; // b开头,后面至少一个a返回true, 否则返回false
re = /^ba*$/; // b开头,后面0-n个a返回true, 否则返回false
re = /^ba?$/; // b开头,后面0-1个a返回true, 否则返回false
10. exec()
- 获取字符串中符合正则表达式的内容
let str = "abcaecafcacc";
// 提取出str中符合axc格式的内容
// g表示全局匹配,执行一次找一次,不写g每次执行都只找第一个符合的内容
let re = /a[a-z]c/ig; // i和g位置互换也可以 gi
let result = re.exec(str); // ['aec', index: 3, input: 'abcaecafcacc', groups: undefined]
result = re.exec(str);
console.log(result); // ['afc', index: 6, input: 'abcaecafcacc', groups: undefined]
result = re.exec(str);
console.log(result); // ['acc', index: 9, input: 'abcaecafcacc', groups: undefined]
result = re.exec(str);
console.log(result); // null
str = "abcaecafcacc";
re = /a(([a-z])c)/ig;
result = re.exec(str);
while(result){
console.log(result[0], result[1], result[2]);
result = re.exec(str)
}
/*
abc bc b
aec ec e
afc fc f
acc cc c
*/
11. 示例
/*
dajsdh13715678903jasdlakdkjg13457890657djashdjka13811678908sdadadasd
取所有手机号,中间四位改为****, 如:13715678903变为137****8903
*/
let str = "dajsdh13715678903jasdlakdkjg13457890657djashdjka13811678908sdadadasd";
// ()分组,g全局匹配
let re = /(1[3-9]\d)\d{4}(\d{4})/g;
let result;
while((result = re.exec(str))){
console.log(result[1] + "****" + result[2]);
}
/*
137****8903
134****0657
138****8908
*/
// 完整匹配
re = /^1[3-9]\d{9}$/;
console.log(re.test("13456789042")); // true
console.log(re.test("1345678904")); // false
12. 字符串的正则
(1)split()
- 可以根据正则表达式来对一个字符串进行拆分
let str = "孙悟空abc猪八戒adc沙和尚";
let result = str.split(/a[bd]c/);
console.log(result); // ["孙悟空", "猪八戒", "沙和尚"]
(2)search()
- 搜索符合正则表达式的内容第一次在字符串中出现的位置
let str = "dajsdh13715678903jasdlakdkjg13457890657djashdjka13811678908sdadadasd";
let result = str.search(/1[3-9]\d{9}/);
console.log(result); // 6
(3)replace()
- 根据正则表达式替换字符串中的指定内容
let str = "dajsdh13715678903jasdlakdkjg13457890657djashdjka13811678908sdadadasd";
let result = str.replace(/1[3-9]\d{9}/g, "哈哈哈"); // g全局匹配,全部被替换
console.log(result); // dajsdh哈哈哈jasdlakdkjg哈哈哈djashdjka哈哈哈sdadadasd
(4)match()
- 根据正则表达式去匹配字符串中符合要求的内容
let str = "dajsdh13715678903jasdlakdkjg13457890657djashdjka13811678908sdadadasd";
let result = str.match(/1[3-9]\d{9}/g);
console.log(result); // ['13715678903', '13457890657', '13811678908']
(5)matchAll()
- 根据正则表达式去匹配字符串中符合要求的内容
- 返回的是一个迭代器
let str = "dajsdh13715678903jasdlakdkjg13457890657djashdjka13811678908sdadadasd";
let result = str.matchAll(/1[3-9]\d{9}/g);
for(let item of result){
console.log(item);
}
/*
['13715678903', index: 6, input: 'dajsdh13715678903jasdlakdkjg13457890657djashdjka13811678908sdadadasd', groups: undefined]
['13457890657', index: 28, input: 'dajsdh13715678903jasdlakdkjg13457890657djashdjka13811678908sdadadasd', groups: undefined]
['13811678908', index: 48, input: 'dajsdh13715678903jasdlakdkjg13457890657djashdjka13811678908sdadadasd', groups: undefined]
*/