抄自:https://www.jianshu.com/p/488d60349325
一、正则声明方式
1. 构造函数方式
var reg = new RegExp('d', 'gi');
通过 new 构造一个正则表达式对象,其中第一个参数 'd' 是正则内容,第二个参数 'gi' 是修饰符。两个参数皆为字符串类型:
(1) 修饰符的作用是对匹配过程进行限定
(2) 修饰符有三种:i, g, m,可以同时出现,没有顺序(即 gi 与 ig 一样)
- i:忽略大小写匹配
- 全局匹配,即是匹配一个后继续匹配,直到结束
- 多行匹配,即是遇到换行后不停止匹配,直到结束
2. 字面量方式
这种方式很常见。
var reg = /d/gi;
两个斜线内为正则的内容,后面可以跟修饰符,与第一种构造函数方式相比更简洁,缺点是正则内容不能拼接,对于大多数场景来说足够了。
二、正则相关符号
1. 方括号 [] 用法
用于查找方括号内的任意字符。
(1) ^ 在 [] 内开始位置及正则双斜线开始位置有特殊含义,其他位置表示 ^ 字符本身。
- 正则开头位置表示以某某开头的字符串,如下表示以大写或小写字母开头的且连续为字母的字符串
'adobe 2016'.match(/^[a-zA-Z]+/); // ["adobe"]
- 在正则 或 匹配中(即 | 匹配),表示 或者以某某字符开始的字符串,如下表示匹配 连续数字 或 以小写字母开头且连续为小写字母的字符串,所以返回结果包含2016 和 adobe,注意返回结果不是 ["2016", "adobe"]
'adobe2016ps'.match(/d+|^[a-z]+/g); // ["adobe", "2016"]
- 在 [] 内开始位置时,表示不匹配 [] 内除 ^ 以外的所有字符:
'adobe'.match(/[^abc]/g); // ["d", "o", "e"]
注: $ 与 ^ 的前两个用法相似,只不过匹配的是以某某字符结尾的字符串,举例:
'adobe 2016'.match(/d+|[a-z]+$/g); // ["2016"] 'adobe'.match(/d+|[a-z]+$/g); // ["adobe"]
(2) - (连字符)表示左边字符的 ASCII 值到右边字符 ASCII 编码值之间及左右字符自身的所有字符
'adobe PS 2016'.match(/[a-g]/g); // ["a", "d", "b", "e"]
(3) - 连字符左侧的字符对应的 ASCII 值一定要小于或等于右侧的字符,否则会报语法错误
'adobe'.match(/[z-a]/); // Uncaught SyntaxError: Invalid regular expression: /[z-a]/: Range out of order in character class...
(4) 如果希望对连字符 - 本身进行匹配,需要用反斜线转义
'adobe-2016'.match(/[a-g-]/g); // ["a", "d", "b", "e", "-"]
(5) 查看 ASCII 表就会发现,大写字母的 ASCII 值是小于小写字母的,因此下面用法会报语法错误
'adobe-2016'.match(/[a-Z]/g); // Uncaught SyntaxError: Invalid regular expression: /[a-Z]/: Range out of order in character ...
那么问题来了,如果要表示所有字母,不区分大小写怎么办呢?其实有两种方式:
- 第一种是使用修饰符 i,前面提到过。举例:
'adobe-PS'.match(/[a-z]/gi); // ["a", "d", "o", "b", "e", "P", "S"]
- 第二种是在正则中明确指明大小写字母,举例:
'adobe-PS'.match(/[a-zA-Z]/g); // ["a", "d", "o", "b", "e", "P", "S"]
返回结果跟第一种一样。当然这个例子有些特殊:匹配了所有大小写字母。当只匹配部分大小写字母的时候只能使用第二种方式。
(6) 匹配大小字母不能写成 [A-z],虽然不会报语法错误,但隐式的放大了匹配范围,查看 ASCII 会发现,在大写字母 Z 到小写字母 a 之间还有 [、 、 ]、 ^、 _、 ` 这6个字符,因此不能这么写。
- 匹配任意单个字符,除换行和结束符
'1+0.2*2=1.4'.match(/.{2}/g); // ["1+", "0.", "2*", "2=", "1."]
- w 匹配任意单词字符(数字、字母、下划线),等价于[A-Za-z0-9_]
'ad34~!@$ps'.match(/w/g); // ["a", "d", "3", "4", "p", "s"]
- W 匹配任意单词字符,与w相反,等价于[^A-Za-z0-9_]
'ad34~!@$ps'.match(/W/g); // ["~", "!", "@", "$"]
- d 匹配数字,等价于 [0-9]
'ps6'.match(/d/g); // ["6"]
- D 匹配非数字,等价于 [^0-9]
'ps6'.match(/D/g); // ["p", "s"]
- s 匹配空白字符,主要有( 、f、 、 、v),注意'asb'中的s依然是字符s,所以'asb'.match(/s/g)返回 null
'adobe ps'.match(/s/g); // [" "]
- S 匹配非空白字符,与s相反
'adobe ps'.match(/S/g); // ["a", "d", "o", "b", "e", "p", "s"]
- 匹配单词边界,注意连续的数字、字母或下划线组成的字符串会认为一个单词
'adobe(2016) ps6.4'.match(/(w+)/g); // ["adobe", "2016", "ps6", "4"]
- B 匹配非单词边界,仔细体会下面的示例与的结果
'adobe(2016) ps6.4'.match(/B(w+)/g); // ["dobe", "016", "s6"]