正则表达式是用于匹配字符串中字符组合的模式。在js中正则表达式也是对象。
- 创建正则表达式
使用一个正则表达式字面量,其由包含在斜杠之间的模式组成,如下:
const regex = /abc/;
在加载脚本后,正则表达式字面值提供正则表达式的编译。当正则表达式保持不变时,使用此方法可以获得更好的性能。
或者调用Regexp
对象的构造函数,如下:
const regexp = new Regexp('abc');
- 正则表达式概述
const example = /pattern/flags;
模式(pattern)部分可以是任何简单的或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。
每个正则表达式都可带有一个或多个标志(flags),泳衣标明正则表达式的行为。正则表达式支持下列三个标志:
- g:表示全局(global)模式,即模式将被用于所有字符串,而非在发现第一个匹配项时立即停止。
- i:表示不区分大小写模式,即在确定匹配项时忽略模式与字符串的大小写。
- m:表示多行模式,即在到达一行文本末尾时还会继续查找下一行中是否存在于模式匹配的项。
如果多个标志同时使用时,则写成:gmi。
- () [] {} 的区别
()的作用是提取匹配的字符串。表达式中有几个()就会得到几个相应的匹配字符串。比如(\s+)表示连续空格的字符串。
[]是定义匹配的字符串范围。比如[a-zA-Z0-9]表示字符文本要匹配英文字符和数字。
{}一般用来表示匹配的长度。比如\d{3}表示匹配三个数字,\d{1,3}表示匹配1~3个数字,\d{3,}表示匹配3个以上数字。 - ^与$
^ 匹配一个字符串的开头,比如(^a)就是匹配以字母a开头的字符串
$ 匹配一个字符串的结尾,比如(b$)就是匹配以字母b结尾的字符串
^ 还有另一个作用就是取反,比如[^xyz]表示匹配的字符串不包含xyz
. (小数点)匹配除换行符之外的任何单个字符
注意问题:
- 如果^出现在[]中一般表示取反,而出现在其他地方则是匹配字符串的开头
2.^ 和 $ 配合可以有效匹配完整字符串
- \d \s \w .
\d 匹配一个非负整数,等价于[0-9]
\s 匹配一个空白字符串
\w 匹配一个英文字母或数字,等价于[0-9a-zA-Z]
. 匹配除换行符以外的任意字符,等价于[^\n] - ? + *
- 用 * 表示匹配前面元素0次或多次,比如(\s*)就是匹配0个或多个空格
- 用 + 表示匹配前面元素1次或多次,比如(\d+)就是匹配由至少一个整数组成的字符串
- 用 ? 表示匹配前面元素0次或一次,相当于{0,1},比如(\w?)就是匹配最多由一个字母或数字组成的字符串
- $1与\1
$1-$9存放着正则表达式中最近的9个正则表达式提取的结果,这些结果按照子匹配的出现顺序依次排列。基本语法是RegExp.$n,这些属性是静态的,除了replace中的第二个参数可以省略RegExp之外,其他地方都要使用RegExp。
// 使用RegExp访问
/(\d+)-(\d+)-(\d+)/.test("2018-02-01");
RegExp.$1 // 2018
RegExp.$2 //02
RegExp.$3 //01
// 在replace中使用
"2018-02-01".replace(/(\d+)-(\d+)-(\d+)/,"$1年$2月$3日");
// 2018年02月03日
\1表示后向引用,是指在正则表达式中从左往右数,第一个()中的内容,以此类推,\2表示第二个(),\0表示整个表达式
// 匹配日期格式,表达式中的\1代表重复(\-|\/|.)
const rgx = /\d{4}(\-|\/|.)\d{1,2}\1\d{1,2}/
rgx.test("2018-02-01"); // true
rgx.test("2018-02.01"); // false
rgx.test("2018/02/01"); // true
rgx.test("2018.02.01"); // true
两者的区别是:\n只能用在表达式之中,而$n只能用在表达式之外的地方。
- test与match
test是用来检测字符串是否匹配某一个正则表达式,如果匹配就返回true,反之则返回false。
match是获取正则表达式匹配到的结果,以数组的形式返回。 - replace 本身是js字符串对象的一个方法,它允许接受两个参数:
replace([RegExp|String],[String|Function])
第一个参数可以是一个普通的字符串或是一个正则表达式
第二个参数可以是一个普通的字符串或是一个回调函数
如果第一个参数是RegExp,JS会先提取RegExp匹配出的结果,然后用第二个参数逐一替换匹配出的结果。
如果第二个参数是回调函数,每匹配到一个结果就回调一次