把2017年的笔记整理一下,方便查找。记录了js正则表达式常用的概念、字符、以及方法。
一、RegExp对象
JavaScript通过通过内置对象RegExp支持正则表达式,有两种方法实例化RegExp对象:
- 字面量:
var reg = /文本/g
- 构造函数:
var reg = new RegExp("\\bis\\b\", 'g')
二、修饰符
修饰符 |
含义 |
g: glogbal |
全文搜索(默认搜索到第一个匹配停止) |
i: ignore case |
忽略大小写(默认大小写敏感) |
m: multiple lines |
多行搜索 |
如(*+$^.|(){}[])等,指在正则表达式中有特殊含义的非字母字符。一般情况下正则表达式的一个字符对应字符串的一个字符。
匹配+
等特殊字符,可先转义,再匹配,如string.replace(/[\+]/g, "")
- 普通类
[]
若要对应多个字符,可用元字符[]
来构建一个简单的类,所谓类是指符合某些特性的对象,一个泛指,而不是特指某个字符。 1
| 'a1b2c3d4'.replace(/[abc]/gi, 'X')
|
- 反向类
[^xx]
[^..]
使用元字符^
创建反向类,即不属于某类的内容。 1
| 'a1b2c3d4'.replace(/[^abc]/gi, 'X')
|
- 范围类
[x-x]
使用[a-z]
来连接两个字符,表示从a到z的任意字符 (包含a,z本身)。在[]
组成类的内部可以连写[a-zA-Z]
- 预定义类
正则表达式提供预定义类来匹配常见字符类
字符 |
等价类 |
含义 |
. |
[^\r\n] |
除回车符和换行符之外的所有字符 |
\d |
[0-9] |
数字字符 |
\D |
[^0-9] |
非数字字符 |
\s |
[\t\n\f\r] |
空白符 |
\S |
[^\t\n\f\r] |
非空白符 |
\w |
[a-zA-Z_0-9] |
单词字符(字母、数字、下划线) |
\W |
[^a-zA-Z_0-9] |
非单词字符 |
5. 边界 |
|
|
常见的边界匹配字符如下 |
|
|
字符 |
含义 |
^ |
以xxx开始(注意^ 要写在字符前面) |
$ |
以xxx结束(注意$ 要写在字符后面) |
\b |
单词边界 |
\B |
非单词边界 |
1 2
| '@123@abc@'.replace('^@', 'Q'); '@123@abc@'.replace('@$', 'Q');
|
- 量词
匹配连续出现多次的字符串(仅作用于紧挨着它的字符)
字符 |
含义 |
? |
出现零或一次(最多出现一次) |
+ |
出现一次或多次(至少出现一次) |
* |
出现零次或多次(任意次) |
{n} |
出现n次 |
{n,m} |
出现n到m次 |
{n,} |
至少出现n次 |
{0,m} |
至多出现m次 |
- 贪婪模式
尽可能多的匹配,直到匹配失败1
| '12345678'.replace(/\d{3,6}/g,'X');
|
- 非贪婪模式(在量词后边加
?
)
尽可能少的匹配,一旦匹配成功,不再继续尝试;匹配前面的子表达式零次或一次,等价于 {0,1}1
| '12345678'.replace(/\d{3,6}?/g, 'X');
|
- 分组
使用()
可以达到分组的功能,使量词作用于分组1
| 'a1b2c3d4'.replace(/([a-z]\d{3})g/, 'X')
|
- 反向引用
使用$1、$2、$3...
来表示和捕获分组后的内容1
| '17741881234'.replace(/(.{3})(.{4})(.{4})/, '$1****$3')
|
- 忽略分组
不希望捕获某些分组,只需要在分组内加上?:
即可
- 或
使用|
可以达到或的效果
- 前瞻
正则表达式从文本头部向文本尾部开始解析。 文本尾部的方向,称为“前”,文本头部称为“后”。 前瞻就是在正则表达式匹配规则的时候,向前检查是否符合断言(条件),后顾/后瞻方向相反。JavaScirpt不支持后顾。符合/不符合 特定断言称为 肯定/正向匹配 和 __否定/负向匹配__。
四、RegExp对象方法
- RegExp.prototype.test(str)
用于测试字符串参数中是否存在匹配正则表达式的字符串,若存在返回true,否则返回false
- RegExp.prototype.exec(str)
使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果。如果没有匹配的文本则返回null,否则返回一个结果数组。
五、String对象方法
- String.prototype.search(reg)
用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。方法返回第一个匹配结果的index,查找不到返回-1。search()方法不执行全局匹配,它将忽略标志g,并且总是从字符串的开始进行检索。
- String.prototype.match(reg)
用于检索字符串,以找到一个或者多个与正则表达式匹配的文本。如果匹配到了一个或多个字符串,则返回一个数组,若没有匹配到,则返回null。它不会忽略全局标志g。
- String.prototype.split(reg)
使用split方法把字符串分割为字符数组。
- String.prototype.replace(str/reg, str)
用于替换字符串中匹配正则表达式或字符串的文本。
六、常用的正则表达式记录