做前端这么久了,坦白说,对正则从没认真学习过,一方面觉得细节记不住,学明白比较难,另一方面觉得工作中需要用到的正则表达式基本上都可以谷歌出来,导致现在对正则的了解非常浅显~不过现在开始决定要认真学习正则了,因为发现其实很多问题或者复杂的逻辑,如果熟悉正则都可以更高效的解决!
今天这篇文章先从以下方面来了解正则:
什么是正则?
正则表达式是一种文本模式,包括普通字符(a-Z)和特殊字符(称为‘元字符’),正则表达式描述了一种字符串匹配的模式,可以检查一个串是否含有某个子串,将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
元字符
正则的元字符比较多,这里我按类分的列举下,方便记忆:
\ : 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符
锚字符
| 字符 | 含义 |
|---|---|
| ^ | 匹配字符串的开头,在多行检索中,匹配一行的开头 |
| $ | 匹配字符串的结尾,在多行检索中,匹配一行的结尾 |
| \b | 匹配一个单词的边界,简言之,就是位于字符\w和\W之间的位置,或位于字符\w和字符串的开头或者结尾之间的位置 |
| \B | 匹配非单词边界位置 |
字符类
| 字符 | 匹配 |
|---|---|
| [...] | 方括号内的任意字符 |
| [^...] | 不在方括号内的任意字符 |
| . | 除换行符和其他Unicode行终止符之外的任意字符 |
| \w | 任何ASCII字符组成的单词和下划线,等价于[a-zA-Z0-9_] |
| \W | 任何不是ASCII字符组成的单词,等价于[^a-zA-Z0-9_] |
| \s | 任何Unicode空白符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v] |
| \S | 任何非Unicode空白符的字符,注意\W和\S不同 |
| \d | 任何ASCII数字,等价于[0-9] |
| \D | 除了ASCII数字之外的任何字符,等价于[^0-9] |
| [\b] | 退格直接量 |
直接量字符
| 字符 | 数字字符 |
|---|---|
| 字母和数字字符 | 自身 |
| \t | 制表符 |
| \v | 垂直制表符 |
| \n | 换行符 |
| \f | 换页符 |
| \r | 回车符 |
| \xnn | 由十六进制数nn指定的拉丁字符,例如,\x0A 等价于\n |
| \uxxxx | 由十六进制数xxxx指定的Unicode字符,例如\u0009 等价与 \t |
| \cX | 控制字符^X,例如,\cJ等价于换行符\n |
| \num | 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符,参考[tool.oschina.net/uploads/api…] |
| \n | 标识一个八进制转义值或一个向后引用 |
| \nm | 标识一个八进制转义值或一个向后引用 |
| \nml | 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml |
修饰符
| 字符 | 含义 |
|---|---|
| i | 执行不区分大小写的匹配 |
| g | 执行一个全局匹配 |
| m | 多行匹配模式 |
量词(重复字符)
| 量词 | 含义 |
|---|---|
| {n} | 匹配前一项n次 |
| {n,} | 匹配前一项n次或者更多次(大于n次) |
| {n,m} | 匹配前一项至少n次,但不能超过m次 |
| * | 匹配前一项任意次(0次或多次),相当于{0,} |
| ? | 匹配前一项0次或1次,相当于{0,1} |
| + | 匹配前一项1次或多次,相当于{1,} |
选择、分组和引用
| 字符 | 含义 |
|---|---|
| | | 选择,匹配的是该符号左边的子表达式或右边的子表达式 |
| (...) | 组合,将几个项组合为一个单元,这个单元可通过 * + ? | 等符号加以修饰,而且可以记住和这个组合相匹配的字符串以提供适合的引用使用 |
| (?:...) | 只组合,把项组合到一个单元,但不记忆与该组相匹配的字符 |
| \n | 和第n个分组第一次匹配的字符相匹配,组是圆括号中的表达式,组索引是从左到右的左括号数,“(?:” 形式的分组不编码 |
分组引用这里举个例子
把字符串切成连续相同字符的正则怎么写?比如abbcccdddd切成a,bb,ccc,dddd
'abbccddd'.match(/(\w)\1*/g) // ["a", "bb", "cc", "ddd"]
转义
正则表达式里有些字符具有特殊意义,如果要用到它本来的含义,就需要用到(\)来转义。
如下是常见的需要转义的特殊字符:
^ $ . * + ? = !: | \ / [ ] ( ) { }
零宽断言
定义:零宽断言是一种零宽度的匹配,它匹配到的内容不会保存到匹配结果中去,最终匹配的结果只是一个位置而已。
作用:给指定位置添加一个限制条件,用来规定此位置之前或者周的字符必须满足限定条件才能是正则中的子表达式匹配成功
注意:这里所说的子表达式并非只有用小括号括起来的表达式,而是正则表达式中的任意匹配单元。
学习参考:[www.cnblogs.com/onepixel/ar…]
| 字符 | 含义 |
|---|---|
| (?=p) | 零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符 |
| (?!p) | 零宽负向先行断言,要求接下来的字符不与p匹配 |
贪婪 & 惰性
当正则表达式中包含能接受重复的限定符时
贪婪:匹配尽可能多的字符
惰性:匹配尽可能少的字符