一谈到正则表达式,我相信很多人都或多或少有点抗拒,因为它的语法确实有点火星文的味道 != =
但是只要掌握了,我们可以利用它大大提高代码的开发效率,因此掌握正则是十分有必要的,废话不多说,开搞!
正文
正则的定义
正则表达式用于 对字符串进行模式匹配及检索替换,是对字符串执行模式匹配的强大工具
正则的使用姿势
在js里,我们有两种方式来使用正则
- 正则字面量:形如 /^a.*z$/
- 正则对象: 形如 new RegExp(‘\\w+’),需要注意的是使用构造函数创造正则对象时,需要常规的字符转义规则(在前面加反斜杠 \),比如 new RegExp(‘\\w+’) 等价于 /\w+/
正则里的元字符
上一节中我们看到了类似 \w 的特殊字符,它在正则里表示特殊的含义:一个数字或字母或下划线
在正则里,这种特殊字符叫做 元字符,这一类的字符有很多,不同的元字符代表不同的特殊含义,下面列举常见的元字符
- .: 查找单个字符,除了换行和行结束符
- \w: 查找数字、字母及下划线
- \W: 查找非单词字符
- \d: 查找数字
- \D: 查找非数字字符
- \s: 查找空白字符
- \S: 查找非空白字符
- \b: 匹配单词边界
- \B: 匹配非单词边界
- \n: 查找换行符
- \r: 查找回车符
正则里的修饰符
正则里的修饰符用于执行区分 大小写 和 全局匹配
- i: 执行对大小写 不敏感 的匹配,即忽略大小写
- g: 执行全局匹配(查找 所有匹配 而非在找到第一个匹配后停止)
正则里的方括号
方括号用于查找某个范围内的字符,常用的如下
- [abc]: 查找a、b、c三个字符的其中之一
- [^abc]: 查找不是a、b、c三个字符的其他任意一个字符
- [0-9]: 查找任何从 0 至 9 的数字
- [a-z]: 查找任何从小写 a 到小写 z 的字符
正则里的量词
所谓量词,就是指字符 出现的次数,常见的如下
- +: 包含一个或多个
- *: 包含任意个数
- ?: 包含零个或一个
- {n}: 包含n个
- {n,m}: 包含>=n且<=m个
- $: 表明字符串的结尾
- ^: 表明字符串的开头
正则里的方法
正则对象提供了不同的方法,用于满足特定的需求,列举如下
- exec: 检索字符串中指定的值,返回找到的 第一个值,注意会 无视 全局修饰符,比如
1 | console.log(/a/.exec('abca')) |
- test: 用于查找目标字符串中是否存在指定的值,存在返回true,否则返回false,比如
1 | console.log(/a/.test('abca')) //true |
字符串对象里支持正则的方法
在字符串对象里,提供了支持正则使用方式的不同的方法,列举如下
- search: 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,如果没有找到任何匹配的子串,则返回 -1,使用形如
string.search(searchvalue)
- match: 在字符串内检索指定的值,或找到一个或多个正则表达式的匹配,返回匹配结果的数组,该数组的内容依赖于 regexp 是否具有全局标志 g,如果没找到匹配结果返回 null,使用形如
string.match(regexp)
- replace: 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串,注意如果第一个参数是字符串则只替换第一个匹配的子串,如果是正则表达式则根据是否带g标识来判断是全局匹配还是单个匹配,使用形如:
string.replace(searchvalue,newvalue)
- split: 用于把一个字符串分割成字符串数组,使用形如
string.split(separator,limit)
,需要注意limit指定返回数组的最大长度
结语
正则表达式其实就是纸老虎,在不熟悉时觉得很难,熟悉过后就会觉得其实就那样,因此对于任何知识的学习都不要有畏难的情绪,只有内心强大了,才能征服一座座高山,好啦,over!