正则表达式
正则表达式的作用是高效的匹配字符串。学习完正则表达式之后,涉及到字符串的操作第一时间要想到正则表达式。
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)
暂无评论