正则表达式的模式匹配
正则表达式是一个描述字符模式的对象
正则表达式的定义
-
使用正则表达式字面量定义(脚本加载后,会被编译,不变时,性能更好)
- var pattern = /s$/;
-
调用RegExp对象的构造函数定义(在脚本运行过程中,会被编译)
- var pattern = new RegExp("s$");
直接量字符
- 正则表达式所有字母和数字都是按照字面含义进行匹配的
- JavaScript正则表达式语法也支持非字母的字符匹配,这些字符需要通过反斜线(\)作为前缀进行转义
正则表达式直接量的每次计算都会创建一个新的RegExp对象,每个新的对象都有自己的lastIndex属性
正则表达式中的直接量字符
| 字符 | 匹配 |
|---|---|
| 字母和数字字符 | 自身 |
| \o | NUL字符(\u0000) |
| \t | 制表符(\u0009) |
| \n | 换行符(\u000A) |
| \v | 垂直制表符(\u000B) |
| \f | 换页符(\u000C) |
| \r | 回车符(\u000D) |
| \xnn | 由十六进制数nn指定的拉丁字符,例如,\x0A等价于\n |
| \uxxxx | 由十六进制数xxxx指定的Unicode字符,例如,\u0009等价于\t |
| \cx | 控制字符^X,例如,\cJ等价于换行符\n |
字符类
将直接量字符单独放进方括号内就组成了字符类
-
一个字符类可以匹配它所包含的任意字符
-
字符类可以使用连字符来表示字符范围 例如,要匹配拉丁字母表中的小写字母 /[a-z]/
正则表达式中的字符类
| 字符 | 匹配 |
|---|---|
| [...] | 方括号内的任意字符 |
| [^...] | 不在方括号内的任意字符 |
| . | 除换行符和其他Unicode行终止符之外的任意字符 |
| \w | 任何ASCII字符组成的单词等价于 [a-zA-Z0-9] |
| \W | 任何不是ASCII字符组成的单词等价于 [^a-zA-Z0-9] |
| \s | 任何Unicode空白符 |
| \S | 任何非Unicode空白符 |
| \d | 任何ASCII数字等价于 [0-9] |
| \D | 除了ASCII数字之外的任何字符,等价于 [^0-9] |
| [\b] | 退格直接量(特例) |
重复
贪婪的 非贪婪后面加+
正则表达式的重复字符语法
| 字符 | 含义 | 特殊 |
|---|---|---|
| {n , m} | 匹配前一项至少n次,但不能超过m次 | |
| {n , } | 匹配前一项n次或者更多次 | |
| {n} | 匹配前一项n次 | |
| ? | 匹配前一项0次或者1次,等价于 {0 , 1} | 可能与其匹配0个字符串 |
| + | 匹配前一项1次或者多次,等价于 {1, } | |
| * | 匹配前一项0次或者多次,等价于 {0, } | 可能与其匹配0个字符串 |
选择,分组的引用
正则表达式的选择,分组的引用字符
| 字符 | 含义 | 例 | ||
|---|---|---|---|---|
| 选择,匹配的是该字符串左边的子表达式或右边的子表达式(从左到右) | /\d{3} | [a-z]{4}/匹配的是三位数字或者四位小写字母 | ||
| (...) | 组合,将几个项组合为一个单元,这个单元可通过“*” “+” “?”和 “ | ”等符号加以修饰,而且可以记住和这个组合相匹配的字符串以供此后的引用引用 | (/[a-z]+(\d+)/)匹配一个或多个小写字母跟随的一位或多位数字 | |
| (?:...) | 只组合,把项组合到一个单元,但不记忆和这个组合相匹配的字符串 | /([Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*)/在这个正则表达式中\2引用了与(fun\w*)匹配的文本 | ||
| \n | 和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式(也有可能是嵌套的),组索引是从左到右的左括号数,“(?:”形式的分组不编码 | /('")[^'"]*\1/要求左右侧引号相匹配 |
指定匹配位置
正则表达式中的锚字符
| 字符 | 含义 | 例 |
|---|---|---|
| ^ | 匹配字符串的开头,在多行检索中,匹配一行的开头 | /^Script$/匹配单词 Script 啥都不可以多 |
| $ | 匹配字符串的结尾,在多行检索中,匹配一行的结尾 | /^Script$/匹配单词 Script 啥都不可以多 |
| \b | 匹配一个单词的边界,就是位于字符\w和\W之间的位置(注意!,[\b] 匹配的是退格符) | |
| \B | 非边界 | /\B[Ss]cript/与Javascript匹配但不与 script匹配 |
| (?=p) | 零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符 | var reg8 = /^[Ss]cript(?=:)/g;var str = "Script:";console.log(str.match(reg8)) |
| (?!p) | 零宽负向先行断言,要求接下来的字符都不与p匹配 |
修饰符
正则表达式修饰符
| 字符 | 含义 | |
|---|---|---|
| i | 执行不区分大小写的匹配 | |
| g | 执行一个全局匹配 | |
| m | 多行匹配模式 ^ $ 代表每行的开头和结尾 |
用于模式匹配的String方法
search()方法
返回第一个与之匹配的子串的起始位置
特性:
1.不支持全局检索忽略正则表达式参数中的修饰符g
2.如果参数不是正则表达式,则首先会通过RegExp构造函数转换为正则表达式
例: "JavaScript".search(/script/i); //4
replace()方法
执行检索与替换操作
特性:
1.支持全局检索
2.如果参数不是正则表达式,则直接搜索这个字符串,不会转换
例: str.replace(/javascript/ig, "JavaScript"); //str字符串中所有javascript替换为JavaScript
match()方法
返回一个由匹配结果组成的数组
特性:
1.支持全局检索
2.如果执行的不是全局检索,也返回一个数组,数组的第一个元素是匹配的字符串,余下的元素是正则表达式中用圆括号括起来的子表达式。
例:
"1 wwx 3 qwer rwe 2".match(/\d+/g); //["1", "3", "2"]
split()方法
将指定字符串拆分成由子串组成的数组
例: "1, 2, 3, 4, 5".split(/\s*,\s*/); //["1", "2", "3", "4", "5"]
RegExp对象
RegExp构造函数有两个参数
var pattern = new RegExp("s$", "g");
RegExp的属性
- source属性
是一个只读的字符串,包含正则表达式的文本
- global属性
只读的布尔值,说明该正则表达式是否带有修饰符g
- ignoreCase属性
只读的布尔值,说明该正则表达式是否带有修饰符i
- multiline属性
只读的布尔值,说明该正则表达式是否带有修饰符m
- lastIndex属性
可读可写的整数,如果有修饰符g,这个属性储存在整个字符串中下一次检索开始的位置
会被exec() test()方法 用到
RegExp的方法
- exec()
- test()