JavaScript-正则表达式方法(RegExp)
RegExp 对象用于将文本与一个模式匹配。
有两种方法可以创建一个 RegExp 对象:一种是字面量,另一种是构造函数。
字面量由斜杠 (/) 包围而不是引号包围。
构造函数的字符串参数由引号而不是斜杠包围。
new RegExp(pattern[, flags])
一.符集合
1.选择符(|,&)
类似逻辑运算符
2.转义字符(\)
注意需要转义的字符 ,比如后文提及到的元字符也可以这样理解 :d为普通字符 /d 将其转义为元字符使用 .为回车或换行外的任意字符 /.转义为普通字符
在正则中主要存在这些特殊字符:*,+,?,$,^,.,|,\,(,),{,},[,]
注意:创建正则表达式的时候,构造函数方法需要多转义一次或者直接设置字面量传入。
3.边界约束符(^,$)
字符 | 等价类 |
---|---|
^ | 以xxx开始 |
$ | 以xxx结束 |
\b | 单词边界 |
\B | 非单词边界 |
4.普通元字符
d:digit s:space w:word
字符 | 等价类 | 含义 |
---|---|---|
. | [^\r\n] | 除了回车符和换行符之外的所有字符 |
\d | [0-9] | 数字字符 |
\D | [^0-9] | 非数字字符 |
\s | [\t\n\x0B\f\r] | 空白符 |
\S | [^\t\n\x0B\f\r] | 非空白符 |
\w | [a-zA-Z_0-9] | 单词字符(字母、数字、下划线) |
\W | [^a-zA-Z_0-9] | 非单词字符 |
5.量词
字符 | 含义 |
---|---|
? | 出现零次或一次(最多出现一次) 禁止贪婪 |
+ | 出现一次或者多次(至少出现一次) 贪婪 |
* | 出现零次或者多次(任意次) 贪婪 |
{n} | 出现n次 |
{n,m} | 出现n到m次 |
{n,} | 至少出现n次 贪婪 |
6.原子表([ ],[^])
[abcd] 包含其中一个即可 [] 实际代表的就是 一位字符
[^abcd] 只要不是他们四个中的一个即可 [^] 实际代表的就是 一位字符
在原子表中的有些元字符无作用,只会是普通字符,例如 .
匹配所有字符:[\s\S] [\d\D] [\w\W] [^]
let str='dekwjfih4c89fh8h87890@@@##$$1'
console.log(str.match(/[^]+/))
console.log(str.match(/[\s\S]+/))
console.log(str.match(/[\d\D]+/))
console.log(str.match(/[\w\W]+/))
7.原子组 ( ( ),( ?:))
①捕获组:( )
举个例子:
let test=`
<h1>
henry
</h1>
<h2>man</h2>
正常情况下,我们这样提取:
let reg=/<h[1-6]>[\s\S]*</h[1-6]>/
但是发现h[1-6]重复 那么我们可以把它作为一个"组"
模式中的 \1
和 \2
表示第一个和第二个被捕获括号匹配的子字符串,而在正则表达式的替换环节,则要使用像 $1
、$2
、...、$n
这样的语法。$&为当前匹配项,$'为匹配项左边的内容,$`为匹配项右边的内容。
此时后面的h[1-6]我们就可以利用“1”这个组获取
let reg=/<(h[1-6])>[\s\S]*<\/\1>/
利用函数:
无论哪种方式,0为整个内容
练习:验证邮箱
let reg=/^[\w-]+@([\w-]+\.)+(com|net|cn)$/i
②非捕获组:(?:)
③原子组别名 (?< >)
数字可以利用?<>创建别名
例如/?<h>(h[1-6])/ 获取:$<h>即可
8.模式匹配标记(g,i,m,y,u,s)
g和y的区别:
g会跳过不满足的字符,而y只要遇到不满足就停止了
练习:
将下列内容转换为['name','price']输出(跳过非水果类)
let goods=`
#1 apple,200元 #
#2 banana,300元 #
#3 tool #工具
#4 pear,500元 #
`
9.断言匹配 (?<=,?=)
其实可以理解类似为条件语句 ?<=为判断前面的条件 (?<!则为后面不是) ?=为后面 (?!则为后面不是)
例如:把前面有hello的Jack改为jack
二.实例方法
1.RegExp.prototype.test()
test() 方法执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回 true 或 false。
2.RegExp.prototype.exec()
exec()
方法在一个指定字符串中执行一个搜索匹配。返回一个结果数组或 null。
和String的match方法对比:
exec方法使得利用g修正符仍能看到字符属性 这是利用了RegExp.lastIndex这个实例属性。
3.RegExp.prototype.toString()
toString()
返回一个表示该正则表达式的字符串。
4.RegExp.prototype[Symbol.xx]()
支持正则表达式的 String 对象的方法有:
- search: 检索与正则表达式相匹配的值
- match: 找到一个或多个正则表达式的匹配。
- matchAll: 找到一个或多个正则表达式的匹配。(baselin-2020)-相当于match的迭代器版本
- replace: 替换与正则表达式匹配的子串。
- split: 把字符串分割为字符串数组。
三.实例属性
1.RegExp.lastIndex()
lastIndex
是正则表达式的一个可读可写的整型属性,用来指定下一次匹配的起始索引。
正则的两大特性
1.懒惰
正常捕获字符串的时候, 每次都从下标0开始
解决方式: 给正则添加一个修饰符 g
2.贪婪
每次在捕获的时候, 会尽可能的多捕获一些东西(*,+)
解决方法: 在原有的修饰符后添加一个 ? 然后相当于开启非贪婪模式
正则的一些实用
1.批量校验正则
利用Array的实例方法:
const password='123enrY'
let regs=[/^[a-z0-9]{5,10}$/i,/[A-Z]/]
let state=regs.every(item=>item.test(password))
console.log(state?'正确':'错误')
2.封装全局匹配:
function serach(string,reg){
while(res=reg.exec(string)){
result.push(res)
}
}