本文目录:
- 1.简介
- 2.匹配模式
- 3.类
- 4.量词
- 5.边界
- 6.分组
- 7.或
- 8.优先级
- 9.正则表达式方法之test
- 10.正则表达式方法之exec
- 11.字符串方法之search
- 12.字符串方法之replace
- 13.字符串方法之match()
- 14.贪婪模式
- 15.在正则表达式中插入变量
1.简介
正则表达式(Regular Expression) 是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个规则字符串,这个规则字符串用来表达对字符串的一种过滤逻辑。
简单来说就是:按照某种规则去匹配符合条件的字符串。正则表达式的规则是
/ pattern /flags
可以使用字面量形式或者new的方式来创建正则表达式
使用直接字面量创建 ,推荐使用,性能更好,注意这里pattern不能为空,不然以为是注释
var exp1 = /\d/g
// 使用RegExp对象创建
var exp2 = new RegExp('\d', 'g');
2.匹配模式
修饰符表示正则表达式的匹配模式
i 执行对大小写不敏感的匹配
g 执行全局匹配,查找所有匹配而非在找到第一个匹配后停止
m 执行多行匹配,会改变 ^和 $的行为
u 可以匹配4字节的unicode编码
s (ES9) dotAll模式, .可以匹配换行符
3.类
类使用 []来表达,用于查找某个范围内的字符
常用的几种预定义类:
\s [\t\n\x0B\f\r] 空格
\S [^\t\n\x0B\f\r] 非空格
\d [0-9] 数字
\D [^0-9] 非数字
\w [a-zA-Z_0-9] 单词字符 ( 字母、数字、下划线)
\W [^a-zA-Z_0-9] 非单词字符
. [^\r\n] 任意字符,除了回车与换行外所有字符
4.量词
量词表示匹配多少个目标对象,精确匹配长度使用 {}
n* 匹配零个或多个n
n+ 匹配至少一个 n 的字符串
n? 匹配零个或一个n
{n} 匹配n次
{n,m} 匹配n到m次
{n,} 至少匹配n次
5.边界
^ 以xx开始,在类 []中表示非
$ 以xx结束
\b 单词边界
\B 非单词边界
6.分组
分组使用 (),作用是提取相匹配的字符串,使量词作用于分组 比如 hehe{3}是把 e匹配了3次而不是单词,如果希望作用于单词,可以使用分组 (hehe){3}
7.或
分组中使用 | 可以达到或的效果 比如:T(oo|ii)m可以匹配 Toom 和 Tiim
8.优先级
转义 \
括号 ()、 (?:)、 (?=)、 []
字符和位置
或 |
9.正则表达式方法之test
test方法表示用正则去匹配字符串,如果匹配成功返回true,如果匹配失败则返回false
// 匹配日期
var dateStr = '2015-10-10';
var reg = /^\d{4}-\d{1,2}-\d{1,2}$/
console.log(reg.test(dateStr));
10.正则表达式方法之exec
exec() 方法的功能非常强大,它是一个通用的方法,而且使用起来也比 test() 方法以及支持正则表达式的 String 对象的方法更为复杂。
如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本。
当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。
**注意:如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把 lastIndex 属性重置为 0。
let exc = new RegExp(/f/,"g")
let str = 'kkkfkkkkfkkkkkkkfkkk'
let result = exc.exec(str)
console.log(result)
//["f", index: 3, input: "kkkfkkkkfkkkkkkkfkkk", groups: undefined]
console.log(exc.lastIndex)
//4
11.字符串方法之search
当匹配成功的时候返回匹配到的字符串的位置,但是匹配失败返回-1
这个⽅法的也有点像字符串⽅法中的indexOf 写法: 字符串.search(正则表达式)
search()方法不执行全局匹配,它将忽略标识g,并且总是从字符串的开始进行检索。
var str = 'abcdef';
var reg = /b/;
alert(str.search(reg)); //1
var reg = /h/;
alert(str.search(reg)); //-1
12.字符串方法之replace
replace表示正则去匹配字符串,匹配成功的字符串会被新的字符串替换
var str = "床前明⽉光";
var reg = /床/;
str = str.replace(reg,"双⼈床");
alert(str); //双⼈床前明⽉光
// 1. 替换所有空白
var str = " 123AD asadf asadfasf adf ";
str = str.replace(/\s/g,"xx");
console.log(str);
// 2. 替换所有,|,
var str = "abc,efg,123,abc,123,a";
str = str.replace(/,|,/g, ".");
console.log(str);
13.字符串方法之match()
检索字符串,以找到一个或多个与Regexp匹配的文本。
如果Regexp没有全局标识g,那么match()方法就只能在字符串中执行一次,如果没有找到任何匹配的文本,将返回null,否则返回一个数组,其中存放了与它找到的匹配文本有关的信息。返回的数组的第0个元素存放的是匹配文本。
如果Regexp具有标识g则match()方法将执行全局检索,返回匹配到的所有字符串组成的数组。否则返回null。
14.贪婪模式
首先要明确一点的是,正则表达式默认的是贪婪模式,而贪婪模式的意思就是让让正则表达式尽可能多的匹配。
'12345678'.replace(/\d{3,6}/g,‘W’)
//W78
这里匹配数字,3-6次,按照贪婪模式,6次能匹配到的情况最多,因此按6次去匹配。
既然有贪婪模式,那么就会有非贪婪模式
让正则表达式尽可能少的匹配,也就是说一旦成功匹配不再继续尝试就是非贪婪模式 在量词后面加上?即可:
'12345678'.replace(/\d{3,6}?/g, 'W')
//WW78
即123已经匹配到,即可替换,然后456又匹配,再替换。
正则表达式的知识当然不止上面这些,平时用的时候往往都依赖百度查找,但是必要的基础还是掌握的越多越好。
15.在正则表达式中插入变量
当我们想在正则中插入变量,会发现无论怎么写,都会被当作正则的一部分来处理。
解决办法是使用构造函数来代替字面量的定义法
const demoData = "demo"
const names = "[123456789demo]abcdefghijklmnopqrstuvwxyz]"
console.log(names.search(/^\[.*demo\]/))
console.log(names.search(new RegExp("^\\[.*" + demoData + "\\]")))
上面两个的输出结果都是0,代表两者的作用都是一样的。
注意,反斜杠需要转义