正则表达式
正则表达式的作用是高效的匹配字符串。学习完正则表达式之后,涉及到字符串的操作第一时间要想到正则表达式。
1.优势
let a = "456xz789jl12"; //需要得到["456","789","12"]
console.log(fn(a));
//正则方式
function fn(str){
return str.match(/\d+/g);
}
/*
//普通方式
function fn(str){
let len = str.length;
let s = "";
let arr = [];
for(let i=0;i<len;i++){
let n = str.charAt(i);
if( !isNaN(n) ){
s += n;
}else{
s && arr.push(s);
s = "";
}
}
s && arr.push(s);
return arr;
}*/
2.创建正则
-
字面量方式
eg:
let reg = /afei/
,用于匹配字符串中的 “afei” 字段。 -
构造函数形式
eg:
let reg = new RegExp("afei")
,用于匹配字符串中的 “afei” 字段。
3.正则方法
-
正则自身的方法
eg:
reg.test(str)
,检测字符串str中是否包含reg规则,返回布尔值。eg:
reg.exec(str)
,返回包含匹配结果的数组,没有则返回null。如果正则有g
标志,那么继续调用reg.exec(str)
时,紧接着上次的匹配位置往下匹配。 -
字符串中能使用正则的方法
eg:
str.match(reg)
,返回包含匹配结果的数组,和exec类似。eg:
str.replace(reg,str|function)
,将匹配的内容用第二个参数的str或者函数返回值替换,返回替换得到的新字符串。eg:
str.split(reg)
,按照正则规则切割。
4.标志
可以在正则表达式后加上标志,标志分为三种:i
(不区分大小写),g
(全局匹配),m
(换行匹配)。其中i g
较为常用。
eg:let reg = /afei/i
,既可以匹配字段”afei”,又可以匹配字段”AFei”。
5.转义
-
普通意义
\n \r \t
等,用于匹配字符串中对应的转义。 -
特殊配合
\s \S
空格 非空格\d \D
数字 非数字\w \W
字符(数字、字母、下划线) 非字符\b \B
独立部分(起始位置、结束位置、以及除了\w外的) 非独立部分 -
特殊符号转义
比如要匹配 / 这个字符,不能直接写,需要转义,正则里面需要转义的特殊符号有:
()[]{}\/^$|?*+.
。6.量词
重复书写某个规则时可以用量词代替,比如需要重复匹配10个数字,可以由
/\d\d\d\d\d\d\d\d\d\d/
改为/\d{10}/
的写法。- 量词普通写法
{n} n个
{n,m} n~m个,包含n也包含m
{n,} n~无穷大个,包含n
- 量词特殊写法
{1,}
可由+
代替{0,}
可由*
代替{0,1}
可由?
代替- 贪婪与惰性
量词默认贪婪匹配,就是说尽量往指定范围类最大的匹配,在量词后面加上
?
符号,变为惰性匹配,也就是尽量少的去匹配。
7.子项
定义正则时,可以用()
将部分规则包裹起来,这样在使用match或者exec做匹配的时候,能在得到的结果里面拿到该部分匹配的内容。
eg:"abcd12ef".match(/d(\d+)/)
会得到数组["d12","12"]
。
同时,正则的构造函数RxgExp上,有多个$属性,也会存储上一次正则匹配对应的各个子项。
8.字符集
-
范围
可以使用字符集来匹配某一个范围的字符,比如:
[2-7]
,匹配 2-7 之间的任一数字字符。[b-r]
,匹配 b-r 之间的任一字母字符。[\u4e00-\u9fa5]
,匹配任一汉字字符。 -
或者
可以使用字符集来表示或者的需求,比如:
[abc]
,匹配 a或者b或者c 字符。[0-9a-z]
,匹配 数字或者小写字母 字符。[^abc]
,匹配除了 abc 三个字符之外任一字符。
大部分在外面有特殊意义的符号,在这里都没有特殊意义,不需要转义,比如:[(){}]
,匹配 ( 或 ) 或 { 或 } 字符。 而 -
符号在字符集里有特殊意义,所以要在字符集里面表示 – 符号需要转义。
9.其他特殊字符
-
^ 和 $
^
和$
分别表示匹配开始位置 和 匹配结束位置。 -
.
.
表示匹配任意字符,即使在字符集里面,也表示匹配任意字符。
10.捕获组
正则的子项会被记录下来,可以使用捕获组来重复某个子项。
/a(\d\d)\1/
,匹配类似于 “a2323” 或者 “a1919″这样的字符,但与量词不同的是,捕获组所匹配的内容和子项所匹配的内容要一样,所以这个正则不能匹配类似于 “a1223” 或者 “a4976” 这样的字符。
11.断言
/windows(?=98)/
,匹配后面是字符98的 windows 字符。
/windows(?!98)/
,匹配后面不是字符98的 windows 字符。
/(?<=20)19/
,匹配前面是字符20的 19 字符。
/(?<!20)19/
,匹配前面不是字符20的 19 字符。
断言不会算作捕获组。
评论(0)
暂无评论