说说对正则表达式的理解
# 是什么
定义:用来匹配字符串的工具
# 创建方式
- 字面量
let reg = /\d+/g
- RegExp
let reg = new RegExp('\\d+', 'g')
# 匹配规则
常用 | 规则 | 描述 | | - | - | | \ | 转义 | | ^ | 匹配输入的开始 | | $ | 匹配输入的结束 | | * | 匹配前一个表达式 0 次或多次 | | + | 匹配前面一个表达式 1 次或者多次。等价于
{1,}| | ? | 匹配前面一个表达式 0 次或者 1 次。等价于{0,1}| | . | 默认匹配除换行符之外的任何单个字符 | | \d | 匹配一个数字 | | \D | 匹配一个非数字字符 | | \f | 匹配一个换页符 | | \n | 匹配一个换行符 | | \r | 匹配一个回车符 | | \s | 匹配一个空白字符,包括空格、制表符、换页符和换行符 | | \S | 匹配一个非空白字符 | | \w | 匹配一个单字字符(字母、数字或者下划线) | | \W | 匹配一个非单字字符 | | x(?=y) | 匹配'x'仅仅当'x'后面跟着'y'。这种叫做先行断言 | | (?<=y)x | 匹配'x'仅当'x'前面是'y'.这种叫做后行断言 | | x(?!y) | 仅仅当'x'后面不跟着'y'时匹配'x',这被称为正向否定查找 | | x(?=y) | 匹配'x'仅仅当'x'后面跟着'y'。这种叫做先行断言 | | (?<=y)x | 匹配'x'仅当'x'前面是'y'.这种叫做后行断言 | | x(?!y) | 仅仅当'x'后面不跟着'y'时匹配'x',这被称为正向否定查找 |标记 | 标志 | 描述 | | - | - | |
g| 全局搜索。 | |i| 不区分大小写搜索。 | |m| 多行搜索。 | |s| 允许.匹配换行符。 | |u| 使用unicode码的模式进行匹配。 | |y| 执行“粘性(sticky)”搜索,匹配从目标字符串的当前位置开始。 |
# 贪婪模式
尽可能多的匹配
const string = "12345";
const regx = /(\d{1,3})(\d{1,3})/;
console.log( string.match(reg) );
// => ["12345", "123", "45", index: 0, input: "12345"]
# 懒惰模式
尽可能少的匹配
var string = "12345";
var regex = /(\d{1,3}?)(\d{1,3})/;
console.log( string.match(regex) );
// => ["1234", "1", "234", index: 0, input: "12345"]
# 分组()
- 使用()可以进行分组
- $可获取分组的内容
let str = "John Smith";
// 交换名字和姓氏
console.log(str.replace(/(john) (smith)/i, '$2, $1')) // Smith, John
# 匹配方法
- 字符串: match matchAll search replace split
- RegExp:test exec
// match
let str = 'fangdown fang1 down1'
let result = str.match(/fang(\w)*/g) // ["fangdown", "fang1"]
// search
let str = 'fangdown'
str.search(/do/) // 4
// replace
let str = 'hello js fangdown js'
str.replace(/js/ig, '') // hello fangdown
// split 去掉空格
"1,2 ,3".split(/,\s*/) //[1,2,3]
// exec
let str = 'fangdown fang1 down1'
let reg = /fang(\w)*/g
reg.exec(str) // fangdown
// test
/fang/.test(str) // true
# 应用场景
function isIdcard(cardNumber) {
// 基本格式校验,18 位,最后一位可以为 X
if (!/^\d{17}[\dxX]$/.test(cardNumber)) {
return false;
}
// 校验码校验
const wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
const ai = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
let sigma = 0,
n;
for (let i = 0; i < wi.length; i++) {
sigma += wi[i] * +cardNumber[i];
}
n = sigma % 11;
return cardNumber.substr(-1) === ai[n];
}
// 座机号码或手机号码
function isValidTelOrPhoneNumber(telNumber) {
return (
/^(086-)?(0\d{2,3}-)(\d{7,8})(-(\d{3,}))?$/.test(telNumber) ||
/^1[3|4|5|6|7|8|9]\d{9}$/.test(telNumber)
);
}