正则表达式详解

1、基础语法

用来处理字符串的规则

  • 只能处理字符串的
  • 它是一个规则:可以验证字符串是否符合某个规则,也可以把字符串中符合规则的内容捕获到

1.1、创建正则

使用一个正则表达式字面量,其由包含在斜杠之间的模式组成

var re = /\d+/;

调用RegExp对象的构造函数 ,两个参数一个是元字符字符串,一个是修饰符字符串

var re = new RegExp("\\d+");

这两种还是有点语法区别

  1. 构造函数因为传递的是字符串,\需要写两个才代表斜杠

正则表达式由两部分构成

  • 元字符(//在两个斜杠中间的叫元字符)
  • 修饰符

1.2、元字符

1.2.1、量词元字符

设置出现的次数

元字符 含义
***** 零到多次
+ 1到多次(在[]中就代表+号)
? 零或者1次
{n} 出现n次
{n,} 出现n到多次
{n,m} 出现n到m次

1.2.2、特殊元字符

单个或者组合在一起代表特殊含义的

元字符 含义
\ 转义字符
. 除\n(换行符)以外的任意字符
^ 以哪一个元字符作为开始
$ 以哪一个元字符作为结束
\n 换行符
\d 0-9之间的数字
\D 匹配一个非数字字符 (大写和小写的意思是相反的)
\w 数字,字母,下划线中的任意一个字符
\s 一个空白字符(包含空格,制表符,换页符等)
\t 一个制表符(一个TAB键:4个空格)
\b 匹配一个单词的边界
x|y x或者y
[xyz] x或者y或者z中的
[^xy] 除了x/y以外的任意字符
[a-z] 指定a-z这个范围的任意字符
[^a-z] 除了小写a-z的字符
() 正则中的分组符号
(?:) 只匹配不捕获
(?=) 正向预查
(?!) 负向预查

1.2.3、普通元字符

代表普通含义

/zhuzhe/ 只匹配zhuzhe

1.3、修饰符

符号 含义
i 忽略大小写匹配
m 忽略换行匹配(多行匹配)
g 全局匹配

1.4、常用正则

var re= /[xy]/
re.test('xy') //true

var re= /^[xy]$/
re.test('xy') //false

//在[]里面+号就表示普通的+号,但是\d在[]还是0-9
var re=/^[@+]$/
re.test('+') //true

//[]中不存在多位数
var re=/^[10-29]$/  //这个并不是表示10-29,表示1或者0-2或者9

常用的正则表达式

1.4.1、验证是否为有效数字
/*
*1、可以出现+-号,也可以不出现
 2、一位0-9都可以,多位首位不能为0
 3、小数部分可能有可能没有,一旦有后面必须有小数点+数字
 ? 0或者1
 + >=1次
 小数点要转义
*/
var re=/^[+-]?(\d|([1-9]\d+))(\.\d+)?$/ 
1.4.2、验证密码
/*
*1、 数字,字母,下划线
 2、 6-16位
 \w  数字,字母,下划线中的任意一个字符
*/
var re=/^\w{6,16}$/
1.4.3、验证真实姓名
/*
* 1. 尼古拉斯.赵四
  2. 名字长度2-10位,有译文 .汉字
  汉字匹配 [\u4e00-\u9fa5]
*/
var re=/^[\u4e00-\u9fa5]{2,10}(.[\u4e00-\u9fa5]{2,10})*?$/  //这个.写错了
1.4.4、邮箱验证
var reg = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/
1.4.5、身份证验证
var reg=/^\d{17}(\d|X)$/

1.5、正则的捕获

  • 正则RegExp.prototype的方法
    • exec
    • test
  • 字符串String.prototype上支持正则表达式处理的方法
    • replace
    • match
    • split
    • search
    • matchAll
1.5.1、 exec(正则方法)

**exec()** 方法在一个指定字符串中执行一个搜索匹配。返回一个结果数组或 null

index:当前捕获内容在字符串的起始索引

input;原始字符串

正则捕获的懒惰性:每执行一次只能捕获到一个符合正则规则,但是默认情况下,执行多次获取的结果永远都是第一个匹配的,其他的永远匹配不到

当全部捕获时,再次捕获的结果是null

RegExpObject.exec(string)
  • 实例1

    lastIndex:当前正则下一次匹配的起始索引位置(正则的属性),默认是0

    var str="I love antzone ,this is animate";
    var reg=/an/;
    console.log(reg.exec(str));
    /*
     ["an", index: 7, input: "I love antzone ,this is animate", groups: undefined]
    */
    
    var str="I love antzone ,this is animate";
    var reg=/an/g;
    var myArray;
    while ((myArray = reg.exec(str)) !== null) {
      var msg = 'Found ' + myArray[0] + '. ';
      msg += 'Next match starts at ' + reg.lastIndex;
      console.log(msg);
    }
    //Found an. Next match starts at 9
    //VM349:7 Found an. Next match starts at 26
    
  • 实例二:

var str="I love antzone ,this is animate";
//这里不加g,会死循环,不然每次都是从第一个开始捕获
var reg=/an/g;
console.log(reg.exec(str));
//加了这句话,就可以找完所用的 an
reg.lastIndex;
console.log(reg.exec(str));

/*
*["an", index: 7, input: "I love antzone ,this is animate", groups: undefined]
 ["an", index: 24, input: "I love antzone ,this is animate", groups: undefined]
*/
1.5.2、test(正则方法)

**test()** 方法执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回 truefalse

 var re=/an/;
 console.log(re.test('asada')) //fasle
 console.log(re.test('asanda')) //true

//是否在最开始
let str = 'hello world!';
let result = /^hello/.test(str);
console.log(result); 
// true

注意:test会改变正则表达式的lastIndex, (exec() 同样改变正则本身的 lastIndex属性值).

1.5.3、 match(字符串方法)

match() 方法检索返回一个字符串匹配正则表达式的的结果

1、正则表达式不包含 g 标志,str.match() 将返回与 RegExp.exec(). 相同的结果。

2、用法都要加g,不加g就没意义,

3、找不到返回null,找到返回找到值的数组

  • 语法

    str.match(regexp)
    
  • 实例

    var re = /\d/
    var str = "2018abc2019dad2020asas"
    console.log(str.match(re))
    //  ["2", index: 0, input: "2018abc2019dad2020asas", groups: undefined]
    
    var re = /\d/g
    var str = "2018abc2019dad2020asas"
    console.log(str.match(re))
    // ["2", "0", "1", "8", "2", "0", "1", "9", "2", "0", "2", "0"]
    
    var re = /\d+/g
    var str = "2018abc2019dad2020asas"
    console.log(str.match(re))
    //  ["2018", "2019", "2020"]
    
    var re = /an/g
    var str = "2018abc2019dad2020asas"
    console.log(str.match(re))
    // null
    
    "http:/www.baidu.com/?a=1&b=2".match(/([^?&=]+)=([^?&=]*)/g); //["a=1", "b=2"]
    

3、参考链接

JavaScript正则表达式总结

MDN 正则表达式

元字符及其含意完整例表

正则教学视频

posted @ 2019-11-19 19:43  夏沫浅语  阅读(213)  评论(0编辑  收藏  举报