JavaScript高级—正则表达式(正则表达式在 JavaScript 中的使用、正则表达式中的特殊字符、正则表达式中的替换)

目标:

  • 能够说出正则表达式的作用
  • 能够写出简单的正则表达式
  • 能够使用正则表达式对表单进行验证
  • 能够使用正则表达式替换内容 
     

1. 正则表达式概述

1.1 什么是正则表达式

正则表达式( Regular Expression )是用于匹配字符串中字符组合的模式。在 JavaScript 中,正则表达式也是对象。

正则表通常被用来检索、替换那些符合某个模式(规则)的文本,例如验证表单:用户名表单只能输入英文字母、数字或下划线, 昵称输入框中可以输入中文(匹配)。此外,正则表达式还常用于过滤掉页面内容中的一些敏感词(替换),或从字符串中获取我们想要的特定部分(提取)等 

其他语言也会使用正则表达式,本阶段我们主要是利用 JavaScript 正则表达式完成表单验证。

 

1.2 正则表达式的特点

  1. 灵活性、逻辑性和功能性非常的强。
  2. 可以迅速地用极简单的方式达到字符串的复杂控制。
  3. 对于刚接触的人来说,比较晦涩难懂。比如: ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
  4. 实际开发,一般都是直接复制写好的正则表达式。但是要求会使用正则表达式并且根据实际情况修改正则表达式。比如用户名:/^[a-z0-9_-]{3,16}$/

 

2. 正则表达式在 JavaScript 中的使用

2.1 创建正则表达式

在 JavaScript 中,可以通过两种方式创建一个正则表达式。

  • 通过调用RegExp对象的构造函数创建

    var regexp = new RegExp(/表达式/); 
  • 通过字面量创建

    var regexp = /表达式/;

2.2 测试正则表达式 test

test() 正则对象方法,用于检测字符串是否符合该规则,该对象会返回 true 或 false,其参数是测试字符串。

regexObj.test(str);
  • regexObj 是写的正则表达式
  • str 我们要测试的文本
  • 检测 str 文本是否符合我们写的正则表达式规范

 实例: 

<script>
        // 正则表达式在js中的使用

        // 1. 利用 RegExp对象来创建 正则表达式
        var regExp = new RegExp(/123/);
        console.log(regExp);
        // 2. 利用字面量创建 正则表达式
        var rg = /123/;
        console.log(rg);
        // 3.test 方法用来检测字符串是否符合正则表达式要求的规范
        console.log(rg.test(123));//true
        console.log(rg.test('abc'));//false
    </script>

 

3. 正则表达式中的特殊字符

3.1 正则表达式的组成

一个正则表达式可以 由简单的字符构成,比如 /abc/,也可以是 简单和特殊字符的组合,比如 /ab*c/ 。其中特殊字符也被称为 元字符,在正则表达式中是具有特殊意义的专用符号,如 ^ $ 、+ 等。

特殊字符非常多,可以参考:

这里我们把元字符划分几类学习。

 

3.2 边界符

正则表达式中的边界符(位置符)用来提示字符所处的位置,主要有两个字符。

边界符说明
       ^表示匹配行首的文本(以谁开始)
       $表示匹配行尾的文本(以谁结束)

如果 ^ 和 $ 在一起,表示必须是 精确匹配(不能多不能少,只能是这些)。

<script>
        // 边界符 ^ $ 
        var rg = /abc/; // 正则表达式里面不需要加引号 不管是数字型还是字符串型
        // /abc/ 只要包含有abc这个字符串返回的都是true
        console.log(rg.test('abc'));//true
        console.log(rg.test('abcd'));//true
        console.log(rg.test('aabcd'));//true
        console.log('--------------------------');
        var rg = /^abc/;     //必须以abc开头
        console.log(rg.test('abc'));//true
        console.log(rg.test('abcd'));//true
        console.log(rg.test('aabcd'));//false
        console.log('--------------------------');
        var rg = /^abc$/;//精确匹配,要求必须是 abc 字符串才符合规范
        console.log(rg.test('abc'));//true
        console.log(rg.test('abcd'));//false
        console.log(rg.test('aabcd'));//false
        console.log(rg.test('abcabc'));//false
    </script>

 

3.3 字符类

字符类表示有一系列字符可供选择,只要匹配其中一个就可以了。所有可供选择的字符都放在方括号内。

3.3.1 [] 方括号

/[abc]/.test('andy')
// true 

正则含义:后面的字符串只要包含 abc 中任意一个字符,都返回 true

3.3.2 [-] 方括号内部 - 范围符

/^[a-z]$/.test('c')
// true 

含义:方括号内部加上 - 表示范围,这里表示 a 到 z 26个英文字母都可以。

3.3.3 [^] 方括号内部 取反符 ^

/[^abc]/.test('andy')
// false

方括号内部加上 ^ 表示 取反,只要包含方括号内的字符,都返回 false 。

Warning:注意和边界符 ^ 区别,边界符写到方括号外面。

3.3.4 字符组合

/[a-z1-9]/.test('andy')
// true

方括号内部可以使用字符组合,这里表示包含 a 到 z 的 26 个英文字母和 1 到 9 的数字都可以。

 实例:

<script>
        //var rg = /abc/;  只要包含abc就可以 
        // 字符类: [] 表示有一系列字符可供选择,只要匹配其中一个就可以了
        var rg = /[abc]/; // 只要包含有a 或者 包含有b 或者包含有c 都返回为true
        console.log(rg.test('andy'));//true
        console.log(rg.test('baby'));//true
        console.log(rg.test('red'));//false
        console.log('-----------------------------');
        var rg1 = /^[abc]$/; // 三选一 只有是a 或者是 b  或者是c 这三个字母才返回 true
        console.log(rg1.test('aa')); //false
        console.log(rg1.test('a')); //true
        console.log(rg1.test('b')); //true
        console.log(rg1.test('c')); //true
        console.log(rg1.test('abc')); //false
        console.log('-----------------------------');
        var rg2 = /^[a-z]$/;   // 26个英文字母任何一个字母返回 true  - 表示的是a 到z 的范围  
        console.log(rg2.test('d')); //true
        console.log(rg2.test(1)); //false
        console.log(rg2.test('A')); //false
        console.log('-----------------------------');
        // 字符组合
        var rg3 = /^[a-zA-Z0-9_-]$/;// 还是多选一
        console.log(rg3.test('a'));//true
        console.log(rg3.test('A'));//true
        console.log(rg3.test(1));//true
        console.log(rg3.test('_'));//true
        console.log(rg3.test('!'));//false
        console.log('-----------------------------');
        // 如果中括号里面有^ 表示取反的意思 千万和 我们边界符 ^ 别混淆
        var rg4 = /^[^a-zA-Z0-9_-]$/;
        console.log(rg4.test('a'));//false
        console.log(rg4.test('A'));//false
        console.log(rg4.test(1));//false
        console.log(rg4.test('_'));//false
        console.log(rg4.test('!'));//true
    </script>

3.4 量词符

量词符用来设定 某个模式出现的次数

量词说明
*重复次数 ≥ 0
+重复次数 ≥ 1
?重复 0 次或 1 次
{n}重复 n 次
{n,}重复次数 ≥ n
{n,n}重复 n 次到 m 次

实例:

<script>
        // 量词符: 用来设定某个模式出现的次数
        // 简单理解: 就是让下面的a这个字符重复多少次
        // var reg = /^a$/;


        //  *   相当于 >= 0 可以出现0次或者很多次
        // var reg = /^a*$/;
        // console.log(reg.test('')); //true
        // console.log(reg.test('aa')); //true

        //  +   相当于 >= 1 可以出现1次或者很多次
        // var reg = /^a+$/;
        // console.log(reg.test('')); // false
        // console.log(reg.test('a')); // true
        // console.log(reg.test('aaaa')); // true

        //  ?   相当于 1 || 0
        // var reg = /^a?$/;
        // console.log(reg.test('')); // true
        // console.log(reg.test('a')); // true
        // console.log(reg.test('aaaa')); // false

        //  {3 } 就是重复3次
        // var reg = /^a{3}$/;
        // console.log(reg.test('')); // false
        // console.log(reg.test('a')); // false
        // console.log(reg.test('aaa')); // true
        // console.log(reg.test('aaaa')); // false

        //  {3, }  大于等于3
        var reg = /^a{3,}$/;
        // console.log(reg.test('')); // false
        // console.log(reg.test('a')); // false
        // console.log(reg.test('aaa')); // true
        // console.log(reg.test('aaaa')); // true

        //  {3,6}  大于等于3 并且 小于等于6
        var reg = /^a{3,6}$/;
        console.log(reg.test('')); // false
        console.log(reg.test('a')); // false
        console.log(reg.test('aaa')); // true
        console.log(reg.test('aaaa')); // true
        console.log(reg.test('aaaaaaa')); // false
    </script>

 

 

3.5 括号总结

  • 大括号:量词符。里面表示重复次数。
  • 中括号:字符集合。匹配方括号中的任意字符。
  • 小括号:表示优先级。 

在线测试: 菜鸟工具 - 不止于工具

var reg = /abc/; // 只要有abc就行

var reg = /^abc$/;  //必须是abc

var reg = /^[abc]$/;  //可以 a 可以 b 也可以 c

var reg = /^abc{3}$/; // 它只是让c重复三次   abccc

var reg = /^[abc]{3}$/; //abc和让abc任一个重复3次

var reg = /^(abc){3}$/;  // 让abc重复3次

 

 

3.6 预定义类

预定类说明
\d匹配 0-9 之间的任一数字,相当于 [0-9]
\D匹配所有 0-9 以外的字符,相当于 [^0-9]
\w匹配任意的字母、数字和下划线,相当于 [A-Za-z0-9_]
\W除所有字母、数字和下划线以外的字符,相当于 [^A-Za-z0-9_]
\s匹配空格(包括换行符、制表符、空格符等),相等于[\t\r\n\v\f]
\S匹配非空格的字符,相当于 [^\t\r\n\v\f]

 

3.7 正则案例

  • 手机号码:/^1[3|4|5|7|8][0-9]{9}$/
  • QQ:[1-9][0-9]{4,}(腾讯QQ号从10000开始)
  • 昵称是中文:^[\u4e00-\u9fa5]{2,8}$

 

4. 正则表达式中的替换

4.1 replace 替换

replace() 方法可以实现替换字符串操作,用来替换的参数可以是一个字符串或是一个正则表达式。

stringObject.replace(regexp/substr,replacement)
  • 第一个参数:被替换的字符串 或者 正则表达式
  • 第二个参数:替换为的字符串
  • 返回值:一个替换完毕的新字符串

 

4.2 正则表达式参数

当 replace 中第一个参数为正则表达式的时候,还有一个 switch 参数可选。

/表达式/[switch]

switch(也称为修饰符)按照什么样的模式来匹配. 有三种值:

  • g全局匹配
  • i忽略大小写
  • gi全局匹配 + 忽略大小写

举例:

<body>
    <textarea name="" id="message"></textarea> <button>提交</button>
    <div></div>
    <script>
        // 替换 replace
        // var str = 'andy和red';
        // // var newStr = str.replace('andy', 'baby');
        // var newStr = str.replace(/andy/, 'baby');
        // console.log(newStr);

        var text = document.querySelector('#message');
        var btn = document.querySelector('button');
        var div = document.querySelector('div');
        btn.onclick = function () {
            var wd = text.value;
            var rep = wd.replace(/激情|gay/g, '**');
            div.innerHTML = rep;
        }


    </script>
</body>


版权声明:本文为m0_59030524原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。