WebAPI之正则表达式

目录

一、正则的基本使用步骤

二、普通字符和元字符

1、元字符-边界符

<1> 精确匹配

2、元字符 - 量词

3、元字符 - 字符类

<1>  |   或

<2>  []   或的集合

<3>  [-]   范围

<4>  [^]  非,除了某范围外

<5>  .  表示\r与\n以外的任意字符

<5> 匹配中文

4、元字符 - 预定义类

三、正则修饰符

四、正则本质是对象与它的构造函数创建法

五、如何用敏感词库替换

六、正则的exec方法(了解)


一、正则的基本使用步骤

正则是描述字符串特征的

        先准备描述字符串内容的特征

        再准备一段查找的字符串范围

                进行查找即可

如何描述特征?

        需要用到正则对象

语法

/特征/

例:

/男/  // 找字符串里有没有 `男` 这个内容,特征就是符合有`男`

准备一段字符串范围,再去查找特征

语法

/男/.test( 字符串范围 )

// 例
console.log( /黑马/.test( '乾坤未定,你我皆黑马' ) ) // true
console.log( /黑马/.test( '目光朦胧处,忽现一少年身骑白马' ) ) // false

就会去找这个字符串范围里,有没有这个字,有会得到 true, 没有会得到 false


案例:判断文本中又没有  刘德华  三个字

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <input type="text" class="text">
    <script>
        let arr = document.querySelector('.text');
        console.log(arr.value);
        console.log(/刘德华/.test(arr.value));
        arr.addEventListener('blur', function() {
            if (/刘德华/.test(arr.value)) {
                alert('有敏感词');
            } else {
                alert('可以使用');
            }
        });
    </script>
</body>

</html>

二、普通字符和元字符

我们自己写的规则,比如说 /男/ , /刘德华//abc/ 这些都是字面意思,写男就是找男,写刘德华就是找刘德华,写abc就是找abc,这就会所谓的 普通字符

但是在正则中用一些特殊的符号表示了特殊的含义,也就是说,你写一个符号,它可能不是找某个符号,而是找它所蕴含的特殊含义。例如: /./, 它不是找 .,因为 . 在正则中有特殊含义,那么对于这种有特殊含义的字符,我们就称之为 元字符

1、元字符-边界符

 边界符

说明

^

以什么开始

$

以什么结尾

语法:

/^内容/

它不是找^内容,因为^有特殊含义,它代表以什么开头,所以这句话的意思是找 以某个内容开头的字符串

/内容$/ 

 以什么结尾,以这个内容结尾的

注意: ^ 要写在最开头, $ 要写在最末尾

       // 默认这种写法代表只要任意位置有男这个字即可
        console.log( /男/.test('这个世界,有男有女!') ) // true
        console.log( /男/.test('男人就是难') ) // true
        console.log( /男/.test('我的性别是男') ) // true

        
        // 找以 男 开头
        console.log( /^男/.test('这个世界,有男有女!') ) // false
        console.log( /^男/.test('男人就是难') ) // true
        console.log( /^男/.test('我的性别是男') ) // false

        // 找以 男 结尾
        console.log( /男$/.test('这个世界,有男有女!') ) // false
        console.log( /男$/.test('男人就是难') ) // false
        console.log( /男$/.test('我的性别是男') ) // true

<1> 精确匹配

^$ 结合起来就是精确匹配

语法:

/^内容$/ 

 代表字符串只能是这个内容,不能有多余的部分,如果只是这个内容就得到true,否则得到false

举例:

        // 这个就叫精确匹配
        // 只能有 李建雨真帅 这个五个字,不能有其他任意内容
        console.log( /^李建雨真帅$/.test('李建雨真帅棒棒哒') ) // false
        console.log( /^李建雨真帅$/.test('李建雨真帅非常牛逼') ) // false
        console.log( /^李建雨真帅$/.test('李建雨真帅李建雨真帅李建雨真帅') ) // false
        console.log( /^李建雨真帅$/.test('李建雨真帅') ) // true

2、元字符 - 量词

量词

说明

*

出现0次或多次

+

出现1次或多次

?

出现0次或1次

{n}

出现n次

{n,}

出现至少n次

{n,m}

出现至少n次,最大m次

注意这些量词只修饰它左边的那一个字符,所以要修饰整体,记得加小括号包起来

3、元字符 - 字符类

<1>  |   或

或,要么左边要么右边

/1|a|b|d|4/

代表要字符串中出现1、a、b、d、4中的任意一个就返回true

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        console.log(/1|a|b|d|4/.test('哈喽1'));
        console.log(/1|a|b|d|4/.test('哈喽a'));
        console.log(/1|a|b|d|4/.test('哈喽b'));
        console.log(/1|a|b|d|4/.test('哈喽d'));
        console.log(/1|a|b|d|4/.test('哈喽4'));
    </script>
</body>

</html>

 

<2>  []   或的集合

匹配字符集合:中括号里任意一个都可以,也是或的意思

/[1abd4]/

代表要字符串中出现1、a、b、d、4中的任意一个就返回true

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //   []    或 的用法
        console.log(/[1abd4]/.test('哈喽1'));
        console.log(/[1abd4]/.test('哈喽a'));
        console.log(/[1abd4]/.test('哈喽b'));
        console.log(/[1abd4]/.test('哈喽d'));
        console.log(/[1abd4]/.test('哈喽4'));
    </script>
</body>

</html>

<3>  [-]   范围

表示范围:[起点-终点]

[a-z]        // a-z中的任意一个
[0-9]         // 0-9中的任意一个
[A-Z]         // A-Z中的任意一个

[a-zA-Z0-9] // 代表任意一个大小写字母或者任意一个数字

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //[-]   范围的使用
        console.log(/[a-zA-Z0-9]/.test('表示只要有a到z,A到Z,0到9这个范围内的字符,都会返回ture'))
    </script>
</body>

</html>

<4>  [^]  非,除了某范围外

/[^a-zA-Z0-9]

a到z,A到Z,0到9这个范围外的字符,都会返回ture

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //^   范围的使用
        console.log(/[^a-zA-Z0-9]/.test('a到z,A到Z,0到9这个范围外的字符,都会返回ture'))
    </script>
</body>

</html>

<5>  .  表示\r与\n以外的任意字符

只要没有\n或者\r,都可以返回true

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //  .  表示\r与\n以外的任意字符
        console.log(/[.]/.test('只要没有\n或者\r,都可以返回true,所以这句话返回false'))
    </script>
</body>

</html>

<5> 匹配中文

/[\u4e00-\u9fa5]/

计算机中肯定是不支持中文的,所以中文在计算机中本质上都是转成了对应的英文字母

其中有个很出名的编码叫 unicode 编码,这个叫万国码

万国码:它包含了世界上各种文字,最终都对应到英文字母,用各种字母表示各种文字

/[\u4e00-\u9fa5]/

\u4e00 就是第一个汉字

\u9fa5 就是最后一个汉字

所以这个范围就代表任意汉字

\u 就是unicode编码的前缀


案例:判断用户输入的账号是否合法(字母、数字、下划线,且最少6位,最多10位)

<!DOCTYPE html>
<html lang="CH">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        span {
            display: inline-block;
            width: 250px;
            height: 30px;
            vertical-align: middle;
            line-height: 30px;
            padding-left: 15px;
        }
        
        .error {
            color: red;
            background: url(./error1.png) no-repeat left center;
        }
        
        .right {
            color: green;
            background: url(./right.png) no-repeat left center;
        }
    </style>
</head>

<body>
    <input type="text">
    <span></span>
    <script>
        let input = document.querySelector('input');
        let sp = document.querySelector('span');

        //需求:6-10位长度,由数字字母下划线组成
        input.addEventListener('blur', function() {
            if (/^[a-zA-Z0-9_]{6,10}$/.test(input.value)) {
                //符合条件
                sp.classList.remove('error');
                sp.classList.add('right');
                sp.innerHTML = '输入格式正确';
            } else {
                //不符合条件
                sp.classList.remove('right');
                sp.classList.add('error');
                sp.innerHTML = '输入格式错误';
            };
        });
    </script>
</body>

</html>

案例:用户昵称是否合法(昵称必须是中文字母数字,长度是2-4之间)

<!DOCTYPE html>
<html lang="CH">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        span {
            display: inline-block;
            width: 250px;
            height: 30px;
            vertical-align: middle;
            line-height: 30px;
            padding-left: 15px;
        }
        
        .error {
            color: red;
            background: url(./error1.png) no-repeat left center;
        }
        
        .right {
            color: green;
            background: url(./right.png) no-repeat left center;
        }
    </style>
</head>

<body>
    <input type="text">
    <span></span>
    <script>
        let input = document.querySelector('input');
        let sp = document.querySelector('span');
        input.addEventListener('blur', function() {

            //[\u4e00-\u9fa5]万国码汉字范围
            if (/[\u4e00-\u9fa5]{2,4}$/.test(input.value)) {
                //符合条件
                sp.classList.remove('error');
                sp.classList.add('right');
                sp.innerHTML = '输入格式正确';
            } else {
                sp.classList.remove('right');
                sp.classList.add('error');
                sp.innerHTML = '输入格式错误';
            };
        });
    </script>
</body>

</html>

4、元字符 - 预定义类

预定义类:就是正则里用特殊符号来标识它属于哪一类数据

预定义类

说明

\d

匹配数字

\D

匹配非数字

\w

匹配文本字符,也就是任意字母、数字、下划线

\W

匹配非文本字符,也就是除了字母、数字、下划线

\s

匹配不可见字符  比如空格

\S

匹配可见字符

三、正则修饰符

语法:/正则内容/修饰符。例:/[a-z]/i  忽略大小写的

        i:忽略大小写

        g:全局匹配

        两个一起写,写成 ig 或 gi 就代表 既忽略大小写,也全局匹配

常用于替换文本中的内容:

        字符串的replace,可以替换字符串内容

str.replace(正则表达式, 要替换的内容)

// 例
let str = 'oooOOO哈哈哈OOOooo'
str = str.replace(/o/ig, '') // 把所有的o不区分大小写全部替换成空字符串
console.log(str) // 哈哈

案例: 过滤敏感字

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <textarea name="" id="" cols="30" rows="10"></textarea>
    <button>提交</button>
    <div></div>
    <script>
        let area = document.querySelector('textarea');
        let btn = document.querySelector('button');
        let div = document.querySelector('div');
        btn.addEventListener('click', function() {
            let text = area.value.replace(/敏感词一|敏感词二|敏感词二/ig, '**');
            div.innerHTML = text;
        });
    </script>
</body>

</html>

四、正则本质是对象与它的构造函数创建法

正则本质上就是一个对象,  /规则/  这种写法是字面量表示法

也可以用构造函数创建出一个正则

let 对象名 = new RegExp('规则', '修饰符')

例子:

let reg = new RegExp('ab', 'ig') // 代表忽略大小写而且全局的找ab

// 如果要找字母数字下划线怎么写? 字面量:/\w/
let reg2 = new RegExp('\\w', '修饰符')

注意:如果要写预定义类,要多加一个\,例如\\w 和 \\d,因为 \ 在js字符串中是转义的意思,所以要写 \ 就必须写 \\

五、如何用敏感词库替换

先把敏感词库的数组转成字符串(用 |

再然后用 new RegExp 来创建正则对象

let words = ['敏感词1', '敏感词2', '敏感词3', '敏感词4' ]
let str = words.join('|')
let reg = new RegExp(str, 'ig')
console.log( "今天大家都很敏感词1,也很有敏感词2,大家要爱护敏感词3,支持敏感词4!".replace(reg, '**')   )

 

六、正则的exec方法(了解)

正则对象除了 test 方法,还有一个方法叫 exec ,就是用来做提取内容的

image-20211209165129852.png

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李建雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值