正则表达式学习

113 阅读1分钟

创建正则对象

可以通过构造函数或者字面量创建

构造函数:new RegExp('规则', '标识')

字面量: /规则/标识

let reg = new RegExp('a', 'ig');
console.log(reg.test('123yuabc')); // true

let reg2 = /a/i
console.log(reg2.test('123')); // false

标识

标识字符含义
i不区分大小写
g全局匹配,如果没有此标识,只会匹配第一个
m多行匹配

属性和方法

reg.test(str) 验证字符串是否满足规则

reg是正则对象

str是要验证的字符串

返回值:能匹配到返回 true ,否则返回 false

规则

详见:developer.mozilla.org/zh-CN/docs/…

字符匹配规则

规则书写含义
直接书写一个普通字符匹配书写的字符
[字符规则]匹配[]中出现的所有字符规则
[^字符串规则]匹配[]中没有出现的字符规则
.匹配任意字符
\d匹配数字,等价于 [0-9]
\D匹配非数字
\s匹配空白字符,包括空格、回车、换行、制表
\S匹配所有非空白字符
\w匹配单词字符,等价于 [A-Za-z0-9_]
\W匹配非单词字符,等价于 [^A-Za-z0-9_]
^匹配字符串开始,写到规则开始位置
$匹配字符串结束,写到规则结束位置
\匹配``

示例

// 1. 直接书写一个字符串, 匹配书写的字符
const regStr = /abc/ // 直接匹配 abc 字符串
console.log(regStr.test('13bca89 abc67ab')); // true
console.log(regStr.test('abac')); // false// 2. [字符串规则], 匹配[]中出现的所有字符规则
const reg = /[123]/ // 匹配 1或者 2 或者 3, 注意不是匹配 123
console.log(reg.test('abc3')) // true
console.log(reg.test('23')); // trueconst reg2 = /[0-9]/ // 匹配 0|1|2|3...|9
console.log(reg2.test('aa4')) // true
console.log(reg2.test('bc9')); // true
console.log(reg2.test('3')); // true
console.log(reg2.test('0')); // trueconst reg3 = /[0-9a-zA-Z]/ // 匹配 0|1|2|3...|9 a|b..|z A|B...|Z
​
​
// 3. [^字符串规则] 匹配[]中没有出现的字符规则(相当于取反)
const reg3 = /[^a-z]/; // 表示匹配非小写字母
console.log(reg3.test('a')); // false
console.log(reg3.test('A')); // true
console.log(reg3.test('3')); // true
​
​
// 4. 点 . 匹配任意字符
const reg4 = /./
console.log(reg4.test('文字')) // true
console.log(reg4.test('a')) // true
console.log(reg4.test('4')); // true// 问题来了 如果就是想匹配点呢 -- 需要转义
const reg41 = /./
console.log(reg41.test('文字')) // false
console.log(reg41.test('a')) // false
console.log(reg41.test('.')); // true
​
​
// 5. \d  匹配数字, 等价于[0-9]
const reg5 = /\d/
console.log(reg5.test('3')) // true
console.log(reg5.test('a')); // false// 6. \D  匹配非数字
const reg6 = /\D/
console.log(reg6.test('3')) // false
console.log(reg6.test('a')); // true
console.log(reg6.test('-')); // true
console.log(reg6.test('汉')); // true
​
​
// 7. \s  匹配空白字符,包括空格、回车、换行、制表
const reg7 = /\s/
console.log(reg7.test('  ')) // true
console.log(reg7.test('a')); // false
console.log(reg7.test('3')); // false
​
​
// 8. \S 匹配所有非空白字符
const reg8 = /\S/
console.log(reg8.test('  ')) // false
console.log(reg8.test('a')); // true
console.log(reg8.test('3')); // true
​
​
// 9. \w 匹配单词字符,等价于 [A-Za-z0-9_]
const reg9 = /\S/g
console.log(reg9.test('  ')) // false
console.log(reg9.test('a')); // true
console.log(reg9.test('3')); // true
console.log(reg9.test('+')); // true
console.log(reg9.test('_')); // true
console.log(reg9.test('-')); // true// 10. \W 匹配非单词字符,等价于 [^A-Za-z0-9_]
const reg10 = /\W/g
console.log(reg10.test('  ')) // true
console.log(reg10.test('a')); // false
console.log(reg10.test('3')); // false
console.log(reg10.test('+')); // true
console.log(reg10.test('_')); // false
console.log(reg10.test('-')); // true
​
​
// 11. ^ 匹配字符串开始、写到规则开始位置
const reg11 = /^\d/ // 表示匹配以数字开头
console.log(reg11.test('a12b')); // false
console.log(reg11.test('12b')); // true
console.log(reg11.test('a12')); // false// 12. $ 匹配字符串结束, 写到规则结束位置
const reg12 = /\d$/ // 表示以数字结尾
console.log(reg12.test('a12b')); // false
console.log(reg12.test('12b')); // false
console.log(reg12.test('12')); // true
console.log(reg12.test('2')); // true// 13. \ 匹配 \
const reg13 = /\/
console.log(reg13.test(`ab\ab`)); // true
console.log(reg13.test('12b')); // false
​
以上规则如果不加 g, 都是匹配单个字符串

连续的规则

多个规则可以连续书写,用以匹配多个字符,例如:

/\d[a-zA-Z]/  // 匹配以1个数字紧跟一个字母

若多个规则是或者的关系,使用|分割

/\d[a-zA-Z]|[a-zA-Z]\d/ // 匹配以1个数字紧跟一个字母,或者一个字母紧跟一个数字

规则的重复(量词)

一个或一段规则之后,可以紧跟一个量词,表示前面的规则出现的次数

/[a-zA-Z]\d{3}/  // 匹配1个字母,后面跟上连续的3个数字,{3}是量词,应用的规则是\d
/([a-zA-Z]\d){3}/  // {3}是量词,应用的规则是 [a-zA-Z]\d
量词含义
{n}出现n次
{n, m}出现n-m次
{n,}至少出现n次
*出现0次或多次,等价于{0,}
?出现0次或一次,等价于{0,1}
+出现1次或多次,等价于{1,}
const text = `与啊啊adhu键啊哈哈一样桂以123566啊啊啊`

const newText = text.replace(/啊啊/g, function (s) {
    return `<span>${s}</span>`;
});
console.log(newText) // 与<span>啊啊</span>adhu键啊哈哈一样桂以123566<span>啊啊</span>啊