第十三章正则表达式

366 阅读2分钟

第十三章正则表达式

定义

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

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

字面量写法

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

var expression = /pattern/flags;

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

  • g:表示全局(global)模式,即模式将被应用于所有字符串,而并非在发现第一个匹配项时立即停止
  • i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写
  • m:表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项
//匹配字符串所有'at'的实例
var p = /at/g;
//test()方法返回一个布尔值表示是否可以找到匹配项
console.log(p.test('ataqq'));//true
console.log(p.test('aba'));//false

RegExp构造函数

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

RegExp构造函数接收两个参数:要匹配的字符串模式(pattern)和可选的标志字符串(flags)

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

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

在线测试工具

正则在线校验工具

匹配规则

1.元字符

匹配任意字符(.)

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

位置字符(^和$)

位置字符用来提示字符所处的位置,主要有两个字符

  • ^表示字符串的开始位置
  • $表示字符串的结束位置
//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
选择符(|)

竖线符号(|)在正则表达式中表示“或关系”(OR)。即you|me表示匹配youme

//正则表达式指定必须匹配11或yy
/ll|yy/g.test('hello world');//true

多个选择符可以联合使用

//匹配cat、dog、pig之中的一个
/cat|dog|pig/g
匹配数字和字母以及非字母(\w和\W)

\w匹配数字和字母

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

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

 var str3 = "1234567890abcdefghijkqpeABCDQERTYU+-*/[]\~";
 console.log(/\W/g.test(str3));
匹配数字和非数字(\d\D)

\d只匹配数字,0~9之间的数字

\D匹配除数字以外的任意字符

匹配空白字符\s和\S

\s匹配空白字符

`\S匹配非空白字符

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

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

如果想匹配任意一个中文怎么办?

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

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

// 元字符
// [] 匹配里面的任意字符
// [^a-z] 匹配除a到z之外的所有字符
//中文字符会转义为unicode码  unicode码可以转char code
//我爱你 [\u4e00-\u9fa5]  40809-19968 = 20841

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

匹配了所有不在[一-龥]的之间的字符

重复一次或多次(+)
// 元字符
// + 匹配重复一次或者多次
// *匹配重复0次或者多次字符
//? 匹配重复1次或者是0次
var str = "mjmjjMJMJJMJJJJJJJJjjjjjj";
console.log(/[mM][jJ]+/g.test(str));

匹配重复0个或多个字符(*)
var str = "mjmjjMJMJJMJJJJJJJJ!!!mjjjjjj~~~~~~~~";
console.log(/[mM][jJ]+[!*\.~%&]*/g.test(str));

匹配重复0个或一个(?)

指定重复范围({min,max})

分组匹配()

console.log(/w{3}\.(baidu|goole|mi|apeland)\.(com|cn)?/.test('www.baidu.com'));
console.log(RegExp.$1);//baidu
console.log(RegExp.$2);//com
var str = "https://www.baidu.comhttp://www.goolge.comhttps://www.mi.comhttps://www.apeland.cn";
console.log(/(https|http):\/{2}w{3}\.(baidu|goolge|mi|apeland)\.(com|cn)/g.test(str));

console.log(RegExp.$2);//baidu
var str3 = "https://www.baidu.comhttp://www.goolge.comhttps://www.mi.comhttps://www.apeland.cn";
console.log(/(?:https|http):\/{2}w{3}\.(baidu|goolge|mi|apeland)\.(com|cn)/g.test(str3));
console.log(RegExp.$1);//baidu
?=元 正向肯定预查 表示肯定是元,但不匹配
var str = "200元2000元200刀200磅";
console.log(/\d+(?=元)/g.test(str));

var str = "200元2000元200刀200磅";
console.log(/\d+(?!元|\d)/g.test(str));
?!元 正向否定预查 表示肯定不是元,不匹配

?<=¥ 反向肯定预查 表示肯定是¥,但不匹配
var str = "¥200¥2000$200@2000";
console.log(/(?<=¥)\d+/g.test(str));

?<!¥ 反向否定预查 表示肯定不是¥,不匹配
var str = "¥200¥2000$200@2000";
console.log(/(?<!¥|\d)\d+/g.test(str));

重复类:{4,8}最少4位 最多8位匹配
var str = "121212112333333";
console.log(/\d{4,8}/g.test(str));
正则实例对象的方法

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

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

var str = "hello";
console.log(/l/g.test(str));
console.log(/l/g.exec(str));
字符串方法

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

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

replace():可以替换匹配的值。它接受两个参数,第一个是正则表达式,表示搜索模式,第二个是替换的内容

var re = /l/g;
var str = "hello world";
console.log(str.match(re));//array(3)


console.log(str.search(re));//index = 2
console.log(str.replace(re,'z'));//hezzo worzd

var timeStr = '2019.09.20';
console.log(timeStr.replace(/\./g,'-'));

正则表达式常用案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>P18_验证手机号码和电话号码案例</title>
</head>
<body>
    <script type="text/javascript">
        //1.检查用户账号
            //检验规则:由字母、数字、下划线组成,以字母开头4-16位
            function checkUser(str){
                //模式
                var re = /^[a-zA-Z]\w{3,15}$/g;
                if(re.test(str)){
                    return '正确';
                }
                else{
                    return '错误';
                }
            }
            console.log(checkUser('h132qwertyuiop00'));
        //2.匹配手机号
        //验证规则:
        //1.11位,2.以1开头 3 5 7 8
        function checkMobile(str){
            var re = /^1[3|5|7|8]\d{9}/g;
            if(re.test(str)){
                return '正确';
            }
            else{
                return '错误';
            }
        }
        console.log(checkMobile('19271864651'));
        //3.匹配电话号码
        //验证规则:区号+号码
        // 027-3803604  0536-77777777
        function checkPhone(str){
            // var re = /^0\d{2,3}-?\d{7,8}$/g;
            var re = /^0\d{2,3}-?\d{7,8}$/g;
            if (re.test(str)) {
                console.log('匹配正确');
            } else {
                console.log('匹配错误');

            }
        }
        checkPhone('027-3803604');
        //4.匹配身份证
        //验证规则:18位或者15位全是数字 18位 前17都是数字,最后一位可能是数组或者X或者x
        function checkCard(card){
            var re = /^(\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/g;
            if (re.test(card)) {
                console.log('身份证号合法');
            } else {
                console.log('身份证号不合法');

            }
        }
        checkCard('72070319901055712X');
        //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)) {
                console.log('输入邮箱格式正确');
            } else {
                console.log('输入邮箱格式错误');

            }
        }
        checkEmail('123344444@163.com');


    </script>
</body>
</html>