正则表达式-Regular Expression
-
作用:检验字符串是否符号规则
-
是一个复杂数据类型,存储的是正则表达存储空间的地址
-
特性
-
①懒惰性:当你捕获内容时,每次默认从字符串开头位置检索,添加一个全局匹配
g即可解决 -
②贪婪性:
- 贪婪匹配:尽可能的捕获更多,指的都是限定符;
- 非贪婪匹配:尽可能的捕获更少,在每个限定符后面加上一个
?即可
-
一、创建
(1)字面量方式
var reg = /qwer/
(2)内置构造函数
var reg = new RegExp('qwer')
(3)创建方式的区别
-
①书写正则表达式标识符号的区别
- 字面量:直接书写在正则的后面
- 内置构造函数:以第二个参数的形式书写
var reg1 = /qwer/gi; var reg2 = new RegExp('qwer','ig'); console.log( reg1 ) // /qwer/gi console.log( reg2 ) // /qwer/gi -
②拼接变量的能力
- 字面量:不能进行变量拼接
- 内置构造函数:可以进行变量拼接
var s = 'QQ'; // var reg1 = '/^'+s+'$/'; // console.log( reg1.test('QQ') ); // 报错 reg1是字符串而不是正则 var reg2 = new RegExp('^'+s+'$'); console.log( reg2.test('QQ') ) // true -
③书写基本元字符
- 字面量:
/\s\w/ - 内置构造函数:
new RegExp('\s\d\w')
var reg1 = /\s\d\w/; var reg2 =new RegExp('\s\d\w'); console.log( reg1 ) // /\s\d\w/ console.log( reg2 ) // /\s\d\w/ - 字面量:
二、标识符
-
书写在正则外面,正则表达式后面
-
①
i,忽略大小写var reg = /^[a-z]$/i console.log( reg.test('a') ) // true console.log( reg.test('b') ) // true console.log( reg.test('A') ) // true console.log( reg.test('B') ) // true -
②
g,全局匹配,和捕获一起使用才有效果 -
③
m,多行匹配,和捕获一起使用才有效果
三、常用方法
(1)test(),匹配方法
-
语法:
正则.test(检测的字符串) -
作用:检测字符串是否符号规则
-
返回值:true 或 false
var reg = /qwert/; // 检测的字符串中要包含 'qwert' 字符串片段 var res1 = reg.test('qqwqwqqqrrrrtttttt'); console.log( res1 ); // false var res2 = reg.test('qqwqwqqqrrrrttqwerttttt'); console.log( res2 ) // true
(2)exec(),捕获方法
-
语法:
正则.exec(原字符串) -
作用:从传入的字符串中,获取到符合正则表达式规则的部分字符串片段
-
返回值:
-
①原字符串中没有符合正则要求的字符片段,返回
nullvar reg = /q{2}/; console.log( reg.exec('qwertqwert') ); // null -
②原字符串中有符合正则要求的字符片段,返回一个数组,
[0]位置就是从原字符串中捕获的内容-
2.1、正则表达式中没有
(),也没有全局标识符g- 返回值:只有数组
[0]是正则捕获的字符片段 - 不管捕获多少次,正则都是从原字符串开始的位置进行检索捕获
var reg = /q{2}/; console.log( reg.exec('66qqwertqqwert') ); // qq console.log( reg.exec('66qqwertqqwert') ); // qq console.log( reg.exec('66qqwertqqwert') ); // qq console.log( reg.exec('66qqwertqqwert') ); // qq - 返回值:只有数组
-
2.2、正则表达式中有
()- 返回值:只有数组
[0]是正则捕获的字符片段 - 从
[1]开始依次是每一个小括号的单独捕获内容
var str = '身份证号: 10010820010202001x '; // 10 省份 01 市 08 县 2001 年份 02 月份 02 日期 // 倒数第二位表示性别 奇数是男 偶数女 var reg = /(\d{2})(\d{2})(\d{2})(\d{4})(\d{2})(\d{2})(\d{2})(\d)(\d|x)/ console.log( reg.exec(str) ); - 返回值:只有数组
-
2.3、正则表达式中
g- 返回值:只有数组
[0]是正则捕获的字符片段 - 从第二次捕获开始或从前一次捕获结束的位置开始检索,直到检索不到为止,返回
null,在下一次又从原字符串的开始位置检索
var str = 'qw123erty456uewrt789yuere'; var reg = /\d{3}/g; console.log( reg.exec(str) ); // 123 console.log( reg.exec(str) ); // 456 console.log( reg.exec(str) ); // 789 console.log( reg.exec(str) ); // null console.log( reg.exec(str) ); // 123 - 返回值:只有数组
-
-
四、元字符
- 正则表达式中用一个字符来表示一类内容
(1)基本元字符
-
①
\d,表示字符串中必须包含一位数字(0-9)var reg = /\d/ console.log( reg.test('qewtrey') ) // false console.log( reg.test('qwerty1') ) // true -
②
\D,表示字符串中必须包含一位非数字var reg = /\D/ console.log( reg.test('66666') ) // false console.log( reg.test('1231a') ) // true console.log( reg.test('12_41') ) // true -
③
\s,表示字符串中必须包含一位空白内容(空格、缩进、\n换行 也是空白)var reg = /\s/ console.log( reg.test('213123') ) // false console.log( reg.test('123 231') ) // true console.log( reg.test('211\n231') ) // true -
④
\S,表示字符串中必须包含一位非空白内容var reg = /\S/ console.log( reg.test('\n') ) // false console.log( reg.test(' ') ) // false console.log( reg.test('12313') ) // true console.log( reg.test('21 34') ) // true -
⑤
\w,表示字符串中必须包含一位数字(0-9)、字母(a-zA-Z)、下划线(_)任意内容var reg = /\w/ console.log( reg.test('\n') ) // false console.log(reg.test('!#@')) // fasle console.log( reg.test('dad_@#!') ) // true -
⑥
\W,表示字符串中必须包含一位非数字、字母、下划线任意内容var reg = /\W/ console.log( reg.test('1231312') ) // false console.log( reg.test('!@#@!#') ) // true console.log( reg.test('\n') ) // true -
⑦
.,表示字符串中必须包含一位非换行的任意内容var reg = /./ console.log( reg.test('\n\n\n\n') ) // false console.log( reg.test('\nwww\n666\n\n') ) // true console.log( reg.test('66777') ) // true -
⑧``,表示转义,将具有特殊函数的内容转义为普通内容
var reg = /\d.\d/ // 需要包含 数字.数字 console.log( reg.test('qwer.qwer') ) // false console.log( reg.test('123.qwer') ) // false console.log( reg.test('q123666ewrq') ) // false console.log( reg.test('q123.qwer') ) // false console.log( reg.test('q123.666ewrq') ) // true
(2)限定元字符
-
限定前一个字符连续出现的次数
-
①
*,表示字符串中必须包含连续的内容 0~无数个var reg = /\d*/ console.log( reg.test('') ) // true console.log(reg.test('1')) // true console.log(reg.test('12')) // true -
②
+,表示字符串中必须包含连续的内容 1~无数个var reg = /\d+/ console.log(reg.test('')) // false console.log(reg.test('1')) // true console.log(reg.test('12')) // true -
③
?,表示字符串中必须包含连续的内容 0~1 个var reg = /\d?/ console.log(reg.test('')) // true console.log(reg.test('1')) // true console.log(reg.test('12')) // true -
④
{n},表示字符串中必须包含连续的内容 n 个var reg = /\d{2}/ console.log(reg.test('')) // false console.log(reg.test('1')) // false console.log(reg.test('12')) // true console.log(reg.test('1wr2')) // false console.log(reg.test('1wr2sfd3')) //false console.log(reg.test('14333')) // true -
⑤
{n,},表示字符串中必须包含连续的内容 n~无数个var reg = /\d{2,}/ console.log(reg.test('')) // false console.log(reg.test('1')) // false console.log(reg.test('12')) // true console.log(reg.test('1wr2')) // false console.log(reg.test('1wr2sfd3')) //false console.log(reg.test('14333')) // true -
⑥
{n,m},表示字符串中必须包含连续的内容 n~m 个var reg = /\d{2,4}/ console.log(reg.test('')) // false console.log(reg.test('1')) // false console.log(reg.test('12')) // true console.log(reg.test('1wr2')) // false console.log(reg.test('1wr2sfd3')) //false console.log(reg.test('14333')) // true console.log(reg.test('143')) // true console.log(reg.test('1436')) // true
(3)边界元字符
-
①
^,表示字符串开始,写在正则表达式的最前面var reg = /^\d/; // 表示字符串只能 以一位数字开头 console.log( reg.test('qwerty') ) // false console.log( reg.test('q1werty') )// false console.log( reg.test('q1werty1') )// false console.log( reg.test('1werty1') )// true console.log( reg.test('666werty1') )// true -
②
$,表示字符串结束,写在正则表达式的最后面var reg = /\d$/; // 表示字符串只能 以一位数字结尾 console.log(reg.test('qwerty')) // false console.log(reg.test('q1werty')) // false console.log(reg.test('q1werty1')) // true console.log(reg.test('1werty1')) // true console.log(reg.test('666werty166')) // true -
③注意:当
^和$一起使用时,表示从开始到结束- 没有
^和$叫 包含 - 有
^和$叫 只能
var reg = /^\d$/; // 表示字符串 从开始到结尾 只能是一位数字 console.log( reg.test('qwert') ) // false console.log( reg.test('1aaaa') ) // false console.log( reg.test('1aaaa1') )// false console.log( reg.test('1111') ) // false console.log( reg.test('11') )// false console.log( reg.test('1') )// true console.log( reg.test('9') )// true console.log( reg.test('0') )// true var reg = /^\d{3}$/; // 表示字符串 从开始到结尾 只能是三位连续的数字 console.log( reg.test('qwrew') ) // false console.log( reg.test('q123etre') ) // // false console.log( reg.test('123etre') )// false console.log( reg.test('123') )// true console.log( reg.test('123123') )// false var reg = /^9{3}$/; // 表示字符串 从开始到结尾 只能是 999 console.log( reg.test('99') ) // false console.log( reg.test('999') )// true console.log( reg.test('99999') ) // // false console.log( reg.test('999wetru999') )// false console.log( reg.test('999999') )// false - 没有
(4)特殊元字符
-
①
(),表示一个整体,单独捕获var reg = /^(abc){2}$/; // 表示 只能匹配 'abcabc' 的字符串 console.log( reg.test('abcabc') ) // true console.log( reg.test('abc666abc') ) // false -
②
|(或),一般与()连用,只有()和^和$能区分或边界var reg = /^(asd|qwe)$/; // 表示字符串 只能是 asd或qwe console.log( reg.test('qwe') ) // true console.log( reg.test('asd') ) // true console.log( reg.test('asdqwe') ) // false var reg = /^asd|qwe$/; // 表示字符串 只能是 以 asd 开头 或者 qwe 结尾 console.log( reg.test('qwe') ) // true console.log( reg.test('asd') ) // true console.log( reg.test('asdqwe') ) // true console.log( reg.test('asd666') ) // true console.log( reg.test('666qwe') ) // true console.log( reg.test('666') ) // false -
③
[],写在[]内的任意一个字符都行(一个[]只占一个位置)var reg = /^[asd]$/; // 字符串开头到结尾只能是一位字符串组成,可以是 a 或 s 或 d console.log(reg.test('a')) // true console.log(reg.test('s')) // true console.log(reg.test('d')) // true console.log(reg.test('A')) // false console.log(reg.test('as')) // false console.log(reg.test('aa')) // false -
④
[^],写在[]内的任意一个字符都不行(一个[^]只占一个位置)var reg = /^[^asd]$/; // 字符串开头到结尾只能是一位字符串组成,不可以是a或s或d中的任意一个 console.log(reg.test('a'))// false console.log(reg.test('s')) // false console.log(reg.test('d')) // false console.log(reg.test('A')) // true console.log(reg.test('B')) // true console.log(reg.test('D')) // true console.log(reg.test('as')) // false console.log(reg.test('aa')) // false -
⑤
-,表示范围,一般与[]连用[0-9],表示一位数字;[a-z],表示一位小写字母;[A-Z],表示一位大写字母;[\U4e00-\u9fa5],表示一位中文
var reg = /^[0-9]$/; // 字符串只能是一位数字 console.log(reg.test('0')) // true console.log(reg.test('1')) // true console.log(reg.test('2')) // true console.log(reg.test('9')) // true console.log(reg.test('11')) // false console.log(reg.test('q')) // false
(5)断言元字符
-
①前瞻断言
-
前瞻肯定断言
- 语法:
x(?=y) - 作用:匹配 x,仅当后面跟着 y 时
var reg = /\d(?=d)/; // 字符串中的包含 数字,且数字后必须跟个字符d console.log( reg.test('ddddd') ) // false console.log( reg.test('66666qqq') ) // false console.log( reg.test('dddd1dd') ) // true - 语法:
-
前瞻否定断言
- 语法:
x(?!y) - 作用:匹配 x,仅当后面不跟着 y 时
var reg = /\d(?!d)/; // 字符串中的包含 数字,且数字后必须不能跟个字符d console.log( reg.test('ddddd') ) // false console.log( reg.test('66666qqq') ) // true console.log( reg.test('66666aweqq') ) // true console.log( reg.test('dddd1dd') ) // false - 语法:
-
-
②后瞻断言
-
后瞻肯定断言
- 语法:
(?<=y)x - 作用:匹配 x,仅当跟在 y 后面时
var reg = /(?<=d)\d/; // 字符串中的包含 数字,且数字必须跟在字符d后面 console.log( reg.test('ddddd') ) // false console.log( reg.test('66666qqq') ) // false console.log( reg.test('dddd1dd') ) // true - 语法:
-
后瞻否定断言
- 语法:
(?<!y)x - 作用:匹配 x,仅当不跟在 y 后面时
var reg = /(?<!-)\d+/; // 字符串中的包含 数字,且数字前不能有-字符 console.log( reg.test('-1 -2 -3 -4 -5') ) // false console.log( reg.test('-1 -2 13 4 -5') ) // true console.log( reg.test('-1 -2 13 -5') ) // true - 语法:
-
五、字符串方法
(1)replace()
- 语法:
字符串.replace(正则表达式,换上的字符) - 返回值:替换好的字符,当你传递的是正则表达式,并且有
g全局匹配时,会全部替换
var str = 'qwQQeryQQteyrQQytruQQtrur'
var s = 'QQ'
console.log( str.replace(s,'**') ) // qw**eryQQteyrQQytruQQtrur
console.log( str.replace('QQ','**') ) // qw**eryQQteyrQQytruQQtrur
console.log( str.replace(/QQ/,'**') ) // qw**eryQQteyrQQytruQQtrur
console.log( str.replace(/QQ/g,'**') ) // qw**ery**teyr**ytru**trur
(2)search()
- 语法:
字符串.search(正则表达式) - 返回值:如果有该字符片段,则从字符片段的开始索引位置,没有则返回
-1
var str = 'qwQQeryQQteyrQQytruQQtrur'
console.log( str.search('QQ','**') ) // 2
console.log( str.search('QQQ','**') ) // -1
console.log( str.search(/QQ/,'**') ) // 2
console.log( str.search(/QQ/g,'**') ) // 2
console.log( str.search(/QQQ/g,'**') ) // -1
(3)match()
- 语法:
字符串.match(正则表达式) - 返回值:没有
g的正则时,返回值和exec一样;有g的正则时,返回值是一个数组,里面是捕获的所有内容
var str = 'qwQQ66eryQQ77teyrQQ88ytruQQ99trurQQewtert'
console.log(str.match('QQ', '**'))
console.log(str.match(/QQ/, '**'))
console.log(str.match(/\d{2}/g, '**')) // ['66', '77', '88', '99']
\