初识正则表达式
正则表达式是一个描述字符模式的对象,其表达形式为
const pattern = /s$/;
上面这个简单的正则为匹配所有以"s"结尾的字符串
如果我们采用构造函数的方式也可以定义为
const pattern = new RegExp("s$");
字符
正则表达式中的字母和数字都是按照字面含量进行匹配的,同时,正则表达式还支持非字母的字符匹配,这里有一张对应的表
| 特殊字符 | 正则表达式 | 记忆方式 |
|---|---|---|
| 换行符 | \n | new line |
| 换页符 | \f | form feed |
| 回车 | \r | return |
| 空白符 | \s | space |
| 制表符 | \t | tab |
| 垂直制表符 | \v | vertical tab |
| 回退符 | [\b] | backspace,之所以使用[]符号是避免和\b重复 |
| 字符集 | 正则表达式 | 记忆方式 |
|---|---|---|
| 除了换行符之外的任何字符 | . | |
| 单个数字, [0-9] | \d | digit |
| 除了[0-9] | \D | not digit |
| 包括下划线在内的单个字符 | [A-Za-z0-9_] | |
| 单词字符 | \w | word |
| 非单字字符 | \W | not word |
| 匹配空白字符,包括空格、制表符、换页符和换行符 | \s | space |
| 匹配非空白字符 | \S | not space |
在正则表达式中,许多符号都有特殊含义,比如:
. ? ^ $ + = ! : | \ / () [] {}
- [...] 匹配方括号内任意字符
- [^...] ^作用为非,这里指的是非匹配方括号内任意字符
- $ 表示字符结尾
重复
下表是正则表达式的重复语法
| 字符 | 含义 |
|---|---|
| {m, n} | 匹配前一项至少m次,最多n次 |
| {n,} | 匹配前一项至少n次 |
| {n} | 匹配前一项n次 |
| ? | 匹配前一项0或1次 |
- | 匹配前一项1次或者多次,等价于{1,}
- | 匹配前一项任意次数,等价于{0,}
选择、分组和引用
正则表达式语法还包含指定选项、子表达式分组和前一子表达式特殊字符,我们用“|”表示“或”的关系,用括号()表示分组关系,下面是一些例子
/ab|cd|ef/ // 可以匹配ab也可以匹配cd也可以匹配ef
需要注意的是选择项的尝试匹配是从左往右,直到发现了匹配项,如果左边匹配项匹配,就忽略右边的匹配项,即使右边匹配项结果更好
/a/ab/ // 匹配字符串ab是,只能匹配a
正则表达式的括号有多个作用,其中一个作用是把单独的项组合成表达式
/java(script)?/ // 匹配java或者javaScript
另一个左右在于,允许一个表达式中后部引用前面的子表达式
/([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/ // 嵌套的子表达式([Ss]cript?)可以用/2来表示
而符号?: 表示仅仅进行分组但是不进行引用
/([Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*)/ //这里的([Ss]cript?)不参与计数,/2表示(fun\w*)
下表是关于选择、分组和引用的总结
| 字符 | 含义 | |
|---|---|---|
| \ | 选择,表示匹配符号左边或者右边的表达式 | |
| (...) | 组合为一个单元,可以通过 | ? + * 等符号进行修饰,并且可以记住这个组合供后部引用 |
| (?:...) | 只进行组合,但是不提供引用 | |
| \n | 第n个分组第一次匹配的字符,组索引数是从左往右的括号数,(?:)不参与计数 |
指定匹配位置
正则表达式的锚字符和修饰符
| 字符 | 含义 |
|---|---|
| ^ | 匹配字符串开头,在多行检索中,匹配一行的开头 |
| $ | 匹配字符串结尾,在多行检索中,匹配一行的末结尾 |
| \b | 匹配一个单词边界,简单说就是\w和\W中间的部分,或者位于字符\w和字符串开头或者结尾之间的位置,需要注意的是[\b]匹配的是退格符号 |
| \B | 匹配一个非单词边界 |
| (?=p) | 正向先行断言,要求接下来的字符都要与p匹配,但是整个正则的匹配结果是不包含p部分 |
| (?!p) | 负向先行断言,要求接下来的字符都要不p匹配 |
| i | 不区分大小写(ignore) |
| m | 多行匹配(multi) ^匹配字符串开头或者一行开头,$匹配字符串的结尾或者一行的结尾 |
| g | 全局匹配(global),找到所有匹配项,而不是找到第一个后停止 |
关于\b的使用
/\sjava\s/ // 匹配java(前后有空格)
/\bjava\b/ // 匹配java(前后不包含空格)
关于先行断言使用
/java(?=script)/ 匹配 javascript 匹配结果为java 不匹配javasscript
/java(?!script)/ 匹配javasscript 匹配结果为java 不匹配javascript
修饰符