JavaScript 正则表达式
字符匹配
横向模糊匹配
一个正则可匹配的字符串的长度不是固定的,可以用量词加以限制。
例如:{m,n}表示至少连续出现m次,最多出现n次。
1 | var regex = /ab{2,3}c/g; //这里g是正则的一个修饰符,表示全局匹配,global |
纵向模糊匹配
列出多种可能选择,比如[abc],可以是字符a、b、c任意一个。
1 | var regex = /a[123]b/g; |
修饰符
| 修饰符 | 描述 |
|---|---|
| i | 执行对大小写不敏感的匹配 |
| g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止) |
| m | 执行多行匹配w |
字符组
字符组就是给出一组字符,判断是否含有。
- 范围表示法:用连字符“-“来表示。例如:[1-6] 匹配1~6中数字
如果要匹配的就是”-“,需要在前面加个转义字符”/“
- 排除字符组:反向寻找,求反,求补集意思,用脱字符”^"表示。例如:[^abc] 表示除了abc之外的任意字符
| 字符组 | 具体含义 |
|---|---|
| [0-9],digit数字 | |
| 1,除了0~9 | |
| [0-9a-zA-Z_],word单词字符 | |
| 2 | |
| [ 空格,水平制表符,垂直制表符,换行符,回车符 | |
| 3 | |
| . | 表示任意字符 |
量词
| 量词 | 具体含义 |
|---|---|
| {m,} | 至少出现m次 |
| {m} | 等价于{m,m} 出现m次 |
| ? | 等价于{0,1}出现一次或者不出现 |
| + | 等价于{1,},至少出现一次 |
| * | 等价于{0,},出现任意次,可能不出现L |
贪婪匹配 惰性匹配
尽可能匹配的多;尽可能匹配的少
1 | var regex = /\d{2,3}/g; |
惰性量词,上述表格的量词也是贪婪量词,惰性量词就是在其后加个?
多选分支
用管道符“|”分隔,表示其中任意之一,类似或者。例如:匹配super,hero字符
/super|hero/
匹配十六进制颜色值
表示一个十六进制字符,可以用[0-9a-fA-F]表示,其中字符可以出现3或6次,所以需要用到量词和分支结构
1 | var regex = /#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/g; |
匹配时间
匹配一个24小时制的时间,要求匹配:23:59 02:07
1 | var regex = /([01][0-9]:[0-5][0-9])|(2[0-3]:[0-5][0-9])/g; |
匹配日期
比如yyyy-mm-dd
1 | var regex = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/; |
匹配id
1 | var regex = /id="[^"]*"/; |
位置匹配
位置(锚)是相邻字符之间的位置。
脱字符^ 美元符号$
^ 表示匹配行中开头,\(表示匹配行中结尾,^\)就是代表那个位置了,可以用其它字符替换
1 | var test = "hello".replace(/$/g,"-superhero"); |
多行匹配模式m
1 | var result = 'I\nlove\nSuperhero'.replace(/^/gm,'@'); |
,即,^之间的位置,$之间的位置
的简写,,即
1 | var result = "[JS] James_11.html".replace(/\b/g,'@'); |
和
匹配空白字符:空格、制表符、断行等
是
(?=p) 和 (?!p)
(?=p) ,p前面的位置; (?!p),(?=p)的反面,即后面不是p
1 | var result = "hello".replace(/(?=l)/g,'@') |
(?<=p) (?<!p)
第一个意思是,首先选择p的前面位置,然后定位到p的右边;第二个是第一个反面,即后面不是p然后对p后面一个位置操作
1 | var result = "hello".replace(/(?<=e)/g,'@') |
数字千位分隔符表示法
1 | var result = "12345678".replace(/(?=\d{3}$)/g,',') |
$ 匹配最后3位数字前面的位置,如何弄出所以逗号呢?
1 | var result = "12345678".replace(/(?=(\d{3})+$)/g,',') |
复习量词+ ,我们知道 /a+/ 匹配连续出现的a
1 | var result = "123456789".replace(/(?!^)(?=(\d{3})+$)/g,',') |
验证密码问题
1 | var regex = /(?=.*[0-9]^[0-9A-Za-z]{6,12}$/); |
分组匹配
用括号来对特定对象进行分组,从左至右第一个为第一组… 用$获取组的信息
1 | [1]([0-9]).*([0-9]) 默认前有/ 后有/g |
分组匹配但不捕获
?:模式,匹配但不使用,即不占用$
例如匹配前四串数字的后四位
1 | 14915221000 |
表达式括号
替换
yyyy-mm-dd 格式,替换成 mm/dd/yyyy 怎么做?
1 | var regex = /(\d{4})-(\d{2})-(\d{2})/; |
反向引用
匹配这三组2016-06-12 2016/06/12 2016.06.12
1 | var regex = /\d{4}(-|\/|\.)\d{2}\1\d{2}/; |
我们知道了 \1 的含义后,那么 \2 和 \3 的概念也就理解了,即分别指代第二个和第三个分组。 看到这里,为了更好理解,看一下下面这个
1 | var regex = /^((\d)(\d(\d)))\1\2\3\4$/; |
\10是啥意思捏?
显然是第10个分组,如果真要匹配 \1 和 0 的话,请使用 (?:\1)0 或者 \1(?:0)。
字符串trim方法模拟
1 | Superhero |
- 匹配前后的空格然后用空字符替换
1 | ^\s+|\s+$ |
- 匹配中间的字符串,将原始字符串换为它
1 | ^\s*(.*?)\s*$ |
正则表达式编程
匹配后进行,正则表达式的四种操作,验证、切分、提取、替换
验证
有没有匹配,是不是匹配上,判断是否的操作。
按所属对象划分
- search() match() 属于String对象
- test() exec() 属于RegExp对象
按功能划分
- search() test() 验证是否匹配
- match() exec() 提取匹配项
1 | //用match、search、test、exec,常用test |
切分
1 | var regex = /,/; |
提取
1 | var regex = /^(\d{4})\D(\d{2})\D(\d{2})$/; |
替换
1 | var string = "2017-06-26"; |



