正则表达式

461 阅读2分钟

一、定义

正则表达式(Regular Expression)是一门简单语言的语法规范,是强大、便捷、高效的文本处理工具,它应用在一些方法中,对字符串中的信息实现查找、替换和提取操作

javascript中的正则表达式用RegExp对象表示,有两种写法:一种是字面量写法;另一种是构造函数写法

1、字面量写法

正则表达式字面量定义为包含在一对斜杠(/)之间的字符,并且可以设置3个标志

var expression = /pattern/flags;

正则表达式的匹配模式支持下列3个标志:

  • g:表示全局(global)模式,即模式将被应用于所有字符串,而并非在发现第一个匹配项时立即停止

  • i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写

  • m:表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项

    //匹配字符串所有'at'的实例 var p = /at/g; //test()方法返回一个布尔值表示是否可以找到匹配项 console.log(p.test('ata'));//true console.log(p.test('aba'));//false

2、RegExp构造函数

和普通的内置对象一样,RegExp正则表达式对象也支持new RegExp()构造函数的形式

RegExp构造函数接收两个参数:要匹配的字符串模式(pattern)和可选的标志字符串(flags),标志字符串和字面量的三个标志含义相同:’g’、’i’、’m’。

RegExp构造函数的两个参数都是字符串。且使用字面量形式定义的任何表达式都可使用构造函数

//匹配字符串所有'at'的实例
var p1 = /at/g;
//同上
var p2 = new RegExp('at','g');

3、在线测试工具

https://regexr.com/

二、匹配规则

1、元字符

1、 匹配任意的字符(.)

点字符(.)匹配除回车(\r)、(\n)、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符

2、 位置字符(^ 和 $)

^ 匹配字符串开始的位置
$ 匹配字符串结束的位置
//hello必须出现在开始的位置
/^hello/g.test('hello world');//true
//hello必须出现在结束位置
/world$/g.test('hello world');//true
//从开始位置到结束位置只有hello
/^hello$/g.test('hello');//true
/^hello$/g.test('hello world');//false

3、匹配数字和字母(\w 和 \W)

\w 匹配数字和字母和下划线

注意:下划线\w也匹配到

\W 匹配除数字和字母以及下划线以外的任意字符

4、匹配数字和非数字(\d \D)

\d 匹配数字,0-9的数字

\D 匹配非数字

5、匹配空白字符(\s \S)

\s 匹配空白字符

\S 匹配非空白字符

6、字符集合[a-zA-ZO-9]

1、[a-zA-Z0-9]匹配[]里面的任意字符

2、中文的范围区间为[\u4e00-\u9fa5],其实就是[一-龥(yu)]

unicode转中文站点:www.bejson.com/convert/uni…

3、[^]匹配所有不在这范围内的字符

[^a-z] //匹配除a-z之外的所有字符

7、匹配重复一次或多次 (+)

8、匹配重复0次或者多次的字符(*)

9、匹配重复一次或者是0次 (?)

10、分组匹配 (())

11、或者(|)

console.log(/w{3}\.(baidu|goole|mi|apeland)\.(com|cn)?/.test('www.baidu.com'));
console.log(RegExp.$1);//baidu
console.log(RegExp.$2);//com

12、分组匹配不捕获(?:)

console.log(/w{3}\.(baidu|goole|mi|apeland)\.(?:com|cn)?/.test('www.baidu.com'));
console.log(RegExp.$1);//baidu
console.log(RegExp.$2);

13、正向预查

1、正向肯定预查

例子:

? = 元 //表示肯定是元,但不匹配
2、正向否定预查

例子

?! = 元 //表示肯定不是元,不匹配

14、反向预查

1、反向肯定预查
?<=¥ //表示肯定是¥  但是不匹配
2、反向否定预查
?!<=¥ //表示肯定不是¥  不匹配

15、匹配字符长度的区间({})

例如:

{4,8};//表示输入的字符长度最小为4位,最大为8位

2、正则实例对象的方法

1、test()

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

2、exec()

用来返回匹配结果,如果发现匹配,就返回一个数组,数组中的成员都是匹配的字符串,否则就返回null

3、match()

对字符串进行正则匹配,返回匹配的结果

4、search()

返回第一个满足条件的匹配结果在整个字符串中的位置。如果没有任何匹配,则返回-1

5、replace()

可以替换匹配的值。它接受两个参数,第一个参数为正则表达式,表示模式。第二个为要替换的内容

三、正则表达式常用案例

 //1、用户名输入验证
                 function checkUser(str){
                    //验证规则:以字母开头,由数字、字母、下划线组成、4-16位
                    //模式
                    var re = /[^a-zA-Z]\w{3,15}$/g;
                    if(re.test(str)){
                        return '输入正确';
                    }else{
                        return '输入错误';
                    }
                }
                console.log(checkUser('ll_123')); 

        //2、手机号码验证
          function checkMobild(str){
             var number = /^1[3|5|7|8|9]\d{9}$/g;
             if(number.test(str)){
                 return '输入正确';
             }else{
                 return '输入错误';
             }
         }
         console.log(checkMobild('18712345678')); 

        //3、电话号码验证
                function checkPhone(str){
                    var n = /^0\d{2,3}-?\d{7,8}$/g;
                    if(n.test(str)){
                        return '输入正确';
                    }else{
                        return '输入错误';
                    }
                }
                console.log(checkPhone('023-58722110')); 

        //4、匹配身份证号码
        //15位或者18位,15位的全是数字、18位  前十七位都是数字,最后一位可能是数字或者字符x或者X
         function checkCard(str) {
            var re = /(\d{15}$)|(\d{18}$)|(\d{17}(\d|X|x)$)/g;
            if (re.test(str)) {
                return '输入正确';
            } else {
                return '输入错误';
            }

        }
        console.log(checkCard('500101199802032022')); 

        //5、匹配邮箱
        //第一部分@第二部分.com|cn|net
        function checkEmail(str){
            var re = /^[a-zA-Z0-9-._]+[@][a-zA-Z0-9-._]+\.(com|cn|net)$/g;
            if (re.test(str)) {
                return '输入正确';
            } else {
                return '输入错误';
            }
        }
        console.log(checkEmail('1080414067@qq.com'));