JS-正则表达式

420 阅读1分钟

regexr.com

正则表达式

  1. 字面量写法
//var experssion = /pattern/flags;
var str = 'qaq';
var p = /qaq/g;
console.log(p.test(str));//true
  1. 构造函数写法
//RegExp
var str2 = 'aaabc';
var p1 = new RegExp('aaa','g');
//test()检验匹配的规则是否符合,如果符合返回true
console.log(p1.test(str2));//true

元字符

1. 
//  `.` 匹配所有规则

2.
// ^ $ 位置字符
    ^ 匹配字符串开始的位置
    $ 匹配字符串结束的位置
    
var str3 = 'hello world';
console.log(/world$/g.test(str3));//true

3. 
// `\w` 匹配数字和字母包括下划线
// `\W` 匹配非数字和字母

4. 
// `\d` 匹配数字
// `\D` 匹配非数字

5.
// `\s` 匹配空格
// `\S` 匹配非空格

6.
// `[]` 匹配中括号里面的任意字符
例:/[0-9a-zA-Z]/g 会匹配所有数字字母
   /[\u4e00-\u9fa5]/g 会匹配所有中文
   
// `[^] 匹配除括号中的任意字符
例:/[^a-z]/g 会匹配除a-z之外的所有字符

7.
// `+` 匹配+前面的字符的重复值
例: /qaq+/g 会匹配 qaq qaqq qaqqq,
   /[qQ][aA]+/g 会匹配qaaa Qaaa QaaAA
   
// `*` 匹配0次或多次
例:/[qQ][aA]+[!%^]*/g 可以匹配 qAa^^^ qaa%%% qaa!!
注意:如果遇到 .()$^ 这些字符 需要在前面加上 \ 来转义 \.\(\)\$\^

// `?` 匹配0或者1次

分组匹配

// `()`分组 用RegExp.$数字获取
// `|` 或者
// `?:` 分组匹配不捕获 
实战例子:
console.log(/(http|https):\/{2}w{3}\.(baidu|google|mi)\.(com|cn)/g.test('http://www.baidu.com'));
//true
console.log(RegExp.$2);//baidu
//如果想不读取http以及https这一组
var g = /(?:http|https):\/{2}w{3}\.(baidu|google|mi)\.(com|cn)/g;
console.log(g.test('http://www.baidu.com'));
console.log(RegExp.$2);//com

正/反向预查

正向预查

?= 正向肯定预查 表示肯定是元 但不匹配

?! 正向否定预查 表示肯定不是元 但不匹配

  1. 200元
  2. 2000元
  3. 200刀
  4. 200磅
var a = /\d+(?=元)/g;
//能匹配到1 2里的数字
var b = /\d+(?!元)/g;
//能匹配到1里的20 2里的200 3、4里的200

反向预查

?<= 反向肯定预查 表示肯定是元 但不匹配

?<! 反向否定预查 表示肯定不是元 但不匹配

  1. ¥200
  2. $2000
var g = /(?<=\$)\d+/g;
//能匹配2里的2000
var d = /(?<!\$|\d)\d+/g;
//能匹配1里的200

重复性

{匹配的最小长度,匹配的最大长度}

var a = /\d{4,8}/g;
//这个表示匹配长度为4-8的数字字符串

方法

test() 返回一个布尔值,表示当前模式是否能匹配参数字符串

exec() 用来返回匹配结果。如果匹配,返回一个带有匹配字符串的数组,如果不匹配,返回null。

实际案例

  1. 检查用户账号
    验证规则:由字母,数字,下划线组成,以字母开头 4-16位
var re = /^[a-zA-Z]\w{3,15}$/g
  1. 匹配手机号
    验证规则:11位 以1开头 第二位为3,5,7,8其中一个
var re = /^1[3,5,7,8]\d{9}$/g;
  1. 匹配电话号码
    验证规则: 区号+号码 01088888 010-58888 0523-5555 区号3-4位 可有- 号码7-8位
var re = /^0\d{2,3}-?\d{7,8}/g;
  1. 匹配身份证号
    验证规则:18位或15位 15位:全是数字 18位:前17都是数字,最后一位可能是X或x
var re = /(^(\d{15}$)|(^\d{18}$)|(^\d{17}(\d|x|X)$))/g;
  1. 匹配邮箱 验证规则:第一部分@第二部分.com|cn|net
var re = /^[a-zA-Z0-9-._]+[@][a-zA-Z0-9-._]+\.(com|cn|net)$/g