【JS高级】正则入门基础—关于你想知道的正则表达式_01

目录

❣️ 正则表达式概述

1. 准备:安装RegExpBuddy软件

2. 回顾:注册用户时,要求填写手机号

3. 问题:程序真的认识手机号吗?

4. 正则表达式(Regular Expression)

5. 为何使用正则表达式

❣️ 正则表达式初体验

❣️ 定义正则表达式

1. 普通字符

2. 最简单的正则表达式       

3. 字符集

4. 预定义字符集

5. 数量词

6. 选择和分组

7. 指定匹配位置

◼️ 练习:电子邮件的正则表达式

总结:知识点提炼 


【JS高级】正则入门基础—关于你想知道的正则表达式_01_第1张图片

❣️ 正则表达式概述
 

1. 准备:安装RegExpBuddy软件

    – 安装RegExpBuddy软件——专门测试正则表达式是否正确的软件(RegExRX)【JS高级】正则入门基础—关于你想知道的正则表达式_01_第2张图片

 【JS高级】正则入门基础—关于你想知道的正则表达式_01_第3张图片

 【JS高级】正则入门基础—关于你想知道的正则表达式_01_第4张图片

 – 此时,桌面上看到图标 
            

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第5张图片 

– 配置字体大小

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第6张图片

 – 配置并测试规则匹配是否正常

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第7张图片

2. 回顾:注册用户时,要求填写手机号

–如果填写错误的手机号,程序会提示错误! 

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第8张图片

–如果填写正确的手机号,程序会提示正确 

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第9张图片

3. 问题:程序真的认识手机号吗?

–其实,程序原本不认识手机号,是程序员教程序认识的

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第10张图片

4. 正则表达式(Regular Expression)

专门描述字符串中字符出现规则的表达式。

5. 为何使用正则表达式

因为程序不认识人类语言中的词汇,所以才需要程序员用正则表达式教程序认识人类语言中的词汇。程序员用正则表达式教程序认识人类语言中的词汇。

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第11张图片


❣️ 正则表达式初体验

正则表达式的含义

正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。

正则表达式的用途

正则表达式可用于:– 1. 验证字符串格式;– 2. 查找敏感词(查水表)

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第12张图片


❣️ 定义正则表达式
 

1. 普通字符

  • 最简单的规则,就是一个关键词原文:

    – 比如:“”    第一个字我    第二个字草

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第13张图片

  • 关键词匹配过程

 分别与语句“那天,我去了她家,我说:我草!你家真大”逐字匹配

       →草           

那天,了她家,!你家真大

2. 最简单的正则表达式       

  • 在RegExp Buddy中

          –查找一句话中是否包含敏感词“我草”

          –如果将一句话中的“我草”,换成“我艹”,还能查询出来吗?

3. 字符集

  • 问题:第二个字符换成另一个同音字,就匹配不到了

  • 字符集是规定一位字符上多种备选字的列表

  • 只要规则中某一位字符上有多种备选字时,就用字符集

  • 如何: [备选字列表]

              –比如:[草艹槽]

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第14张图片

  • 匹配时,只要与[]中任意一个字符匹配,就算满足规则 
  • 字符集匹配过程:

[草艹槽]与语句“马在槽里吃草”逐字匹配

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第15张图片

  • 如果再连上前边写死的“我”字规则,可匹配三种词 

 [草艹槽]  →         

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第16张图片

  [草艹槽]  →!你家真大!   

  [草艹槽]  →!你家真大!

   ◼️ 使用字符集

            在RegExp Buddy中

            – 定义一个规则同时匹配“我草” ,“我艹” ,“我槽” 三种敏感词

               答案: 我[草艹槽]     暂时不要考虑拼音和空格!

            – 扩展:修改规则,使其进一步匹配“卧槽”

               答案: [我卧][草艹槽]

  • [我卧][草艹槽]的匹配过程

[我卧][草艹槽]  →[卧槽]  →!你家真大

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第17张图片

  • 再比如,手机号规则:

            – 第一位: 1

            – 第二位:3、4、5、6、7、8、9中选其一

            – 后9位,每一位上都是从0~9十个数字中任选其一

  • 结果:

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第18张图片

  • 简写:如果[]中部分备选字符连续,可用-省略中间字符
     
  • 比如,手机号规则中:

[3456789] 可简写为 [3-9] 读作 39

[0123456789] 可简写为 [0-9] 读作 09

  • 所以,手机号规则可简写为:

–1[3-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]

   ◼️ 使用字符集简写

      在RegExp Buddy中

       –利用字符集简写定义手机号规则,验证手机号

      答案: 1[3-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第19张图片

  •  其它简写:

        –要匹配一位小写字母:[a-z]  共26个

        –要匹配一位大写字母:[A-Z] 共26个

        –要匹配一位字母: [A-Za-z] 共52个

        –要匹配一位字母或数字:[0-9A-Za-z] 共62个

        –要匹配一位汉字:[\u4e00-\u9fa5]

                            19968 ~ 40869   共20902个

                             “一”         "龥"

    ◼️ 使用字符集简写

        RegExp Buddy中(左上角必须选case sensitive区分大小写)

–利用字符集简写定义车牌号规则:

–第一位:1位汉字

–第二位:1位大写字母

–第三位:· (搜狗输入法打dian,按5)

–后五位,每一位:都是一位大写字母或数字

 答案: [\u4e00-\u9fa5][A-Z]·[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第20张图片

4. 预定义字符集

  • 正则表达式语法为四种最常用的字符集定义了最简化写法,称为预定义字符集。
     
  • 包括:

       – 要匹配一位数字: \d   等效于   [0-9]

       – 要匹配一位字母、数字或_: \w  等效于  [0-9A-Za-z_]

       – 要匹配一位空字符:\s 可匹配  空格、制表符Tab等空白

       – 要匹配所有文字(通配符): .

  • 所以,手机号规则可进一步简写为:

       – 1[3-9]\d\d\d\d\d\d\d\d\d

   ◼️ 使用预定义字符集

      在RegExp Buddy中

         – 利用预定义字符集简写手机号规则

       答案: 1[3-9]\d\d\d\d\d\d\d\d\d

        – 利用\s匹配一句英文中的每个空格

        答案: \s

5. 数量词

  • 问题:  手机号规则中\d写了9遍,车牌号规则中[0-9A-Z]也写了五遍!
     
  • 原因:一个字符集(\d或[0-9])只能匹配一位字符,要匹配9位字符,就必须重复写9遍
     
  • 程序用规则匹配字符串,就像彩票兑奖一样,是逐字逐个规则匹配。不但内容要符合规则,位数首先要一致
     
  • 示例:车牌号正则表达式规则(例如:京A·BC345)

       [\u4e00-\u9fa5][A-Z]·[A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]

  • 数量词,是专门规定一个字符集出现次数的规则
     
  • 今后,只要一个字符集在规则中可能连续反复出现多次,就要用数量词以简写方式定义出现次数。
     
  • 如何:数量词紧跟在其修饰的字符集之后,默认修饰相邻的前一个字符集
     
  • 比如:手机号中连续的9个数字\d,可进一步简写为:  1[3-9]\d{9}   ——注:\d{9} = \d*9

   ◼️ 使用数量词

      在RegExp Buddy中

          – 利用数量词进一步简写手机号规则

          答案: 1[3-9]\d{9}

 【JS高级】正则入门基础—关于你想知道的正则表达式_01_第21张图片

          – 利用数量词进一步简写车牌号规则

         答案: [\u4e00-\u9fa5][A-Z]·[0-9A-Z]{5}

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第22张图片

  • 需求:让程序自动识别出短信中的验证码
     
  • 比如:【JS高级】正则入门基础—关于你想知道的正则表达式_01_第23张图片【JS高级】正则入门基础—关于你想知道的正则表达式_01_第24张图片
     
  • 需求:让程序自动识别出短信中的验证码
  • 其实,数量词包括两大类

          – 1. 有明确数量边界的数量词

    字符集{n}    表示字符集必须重复n次,不能多也不能少

    字符集{n,m}  表示字符集至少重复n次,最多重复m次,

                                              n<=                     <=m

    比如: \d{4,6} 表示4到6位数字

    字符集{n,}  表示字符集匹配的内容至少重复n次,多了不限

  示例:有明确数量边界的数量词
 
  \d{3}                     =3个
  \d{3,5}                  3个<=    <=5个
  \d{3,}                    3个<=

 

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第25张图片

        – 2. 没有明确数量边界的数量词

   *    可有可无,多了不限      0个<=

  ?    可有可无,最多一次     0个或1个

             +    至少一次,多了不限     1个<=

示例:没有明确数量边界的数量词

\s *                      0个<= 的空格
\s                   1个<=的空格

        \s                   0个或1个空格

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第26张图片

◼️ 使用不确定数量的数量词

      在RegExp Buddy中

         – 匹配手机短信中的验证码:连续的4位~6位数字

答案: \d{4,6}【JS高级】正则入门基础—关于你想知道的正则表达式_01_第27张图片

– 匹配字符串中的一组连续空字符

答案: \s+ 

6. 选择和分组

  • 问题:屏蔽敏感词时,屌丝把字换成拼音就查不出来了
     
  • 错误的做法: 直接将拼音放入[]中作为字符集中的备选
     
  • 比如:[草cao]
     
  • 希望:  cao
     
  • 其实:字符集只认识单个字,不认识一组拼音

    【JS高级】正则入门基础—关于你想知道的正则表达式_01_第28张图片​​​​​​​
  • 正确做法:选择
     
  • 选择,是指在多个子规则中选其一匹配
     
  • 今后,只要在多个子规则中选其一匹配时,就用选择
     
  • 如何:     子规则1   |   子规则2 
     
  • 读作:  满足规则1    满足规则2
     
  • “|”选择符只分左右,不考虑单个字
     
  • 比如: | cao       草  ↔️ cao

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第29张图片

  • 问题:如果规则写成“我草|cao” 呢?
     
  • 希望是:我草 我cao
     
  • 实际却是:  我草 | cao       我草  ↔️  cao
     
  • 因为“|”选择符只分左右,不考虑单个字符
     
  • 分组,将多个子规则视为一组,再和分组外的规则匹配
     
  • 只要希望将多个子规则视为一个整体,再和其它规则匹配时,就用分组
     
  • 如何: 其它规则 (多个子规则)
     
  • 比如: (草|cao)      草  ↔️  cao

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第30张图片

   ◼️ 使用选择和分组

  • 在RegExp Buddy中定义规则

            – 匹配一个“草” 字或“cao”这个拼音

         答案: 草|cao【JS高级】正则入门基础—关于你想知道的正则表达式_01_第31张图片

          – 匹配“我草”或“我cao”

       答案: 我(草|cao)【JS高级】正则入门基础—关于你想知道的正则表达式_01_第32张图片

   ◼️ 贪婪模式与短路逻辑

  • 问题:\d{4,6},当遇到6位数字时,为什么不优先匹配4位数字,而是直接匹配6位数字呢?
     
  • 答: 默认正则表达式采用贪婪模式匹配敏感词。
     
  • 贪婪模式: 正则表达式总是尽量匹配最长的符合正则要求的字符串。能匹配到6位,就绝不匹配4位!

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第33张图片

  • 问题: \d{6}|\d{4},既能匹配4位,又能匹配6位。但是\d{4}|\d{6},却只能匹配4位,无法匹配6位。
     
  • 答: |不遵守贪婪模式,而是和js程序一样采用短路逻辑
     
  • 短路逻辑: 如果前一个条件已经可以匹配字符串中的部分内容,则后一个条件不再执行!

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第34张图片【JS高级】正则入门基础—关于你想知道的正则表达式_01_第35张图片

  • 需求:同时验证同音字或拼音

    ([草艹槽]|cao)       草 ↔️ 艹 ↔️ 槽 ↔️ cao

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第36张图片

  • 需求:“我” 字也可能是“卧”或“wo”

       ([我卧]|wo)([草艹槽]|cao)    

       草 ↔️ 艹 ↔️ 槽 ↔️ cao 

      草 ↔️ 艹 ↔️ 槽 ↔️ cao 

      wo草 ↔️ wo艹 ↔️ wo槽 ↔️ wocao 【JS高级】正则入门基础—关于你想知道的正则表达式_01_第37张图片

  • 需求:“我” 字也可能是“卧”或“wo” 

        – 第一个字: 我 卧 wo —— ([我卧]|wo)

        – 第二个字: 草 艹 槽 cao ——([草艹槽]|cao)

        – 第一个字和第二个字之间有可能有空格,也可能没有空格,也可能有多个空格——\s*

                   ([我卧]|wo)\s*([草艹槽]|cao)

        – \s+  什么防不住? 没写空格时防不住

        – \s?  什么防不住? 两个以上空格防不住

  • 需求: 可能在中间加不确定个数的空字符:

        – 第一个字: 我 卧 wo —— ([我卧]|wo)

        – 第二个字: 草 艹 槽 cao ——([草艹槽]|cao)

        – 第一个字和第二个字之间有可能有空格,也可能没有空格,也可能有多个空格——\s*

                   ([我卧]|wo)\s*([草艹槽]|cao)\

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第38张图片

   ◼️ 使用选择和分组

  • 在RegExp Buddy中定义规则

​​​​​​​        – 匹配“我草”

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第39张图片

      – 匹配 “卧    槽”

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第40张图片

      – 匹配 “wocao”,“我  草”等敏感词

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第41张图片

       – 定义完整手机号规则:

     +86或0086

     (\+86|0086) ——+是正则有功能的特殊符号,可是这里不希望+当做特殊功能使用,只当做普通字符匹配,所以用\+阻止正则解析+为数量词。

     至少一个空字符 : \s+

     之前所有,整体可有可无,最多一次: ()?

     1

     3~9 任选其一

                9位数字

                答案: ((\+86|0086)\s+)?1[3-9]\d{9}

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第42张图片

        – 定义完整身份证号规则:

    15位数字: \d{15}

    2位数字:  \d\d

    最后一位: 1位数字或x:   [0-9x]

    最后三位 可有可无,最多一次 (最后三位)?

    答案:\d{15}(\d\d[0-9x])?

    匹配测试字符串: 110102200012261 时,测试通过

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第43张图片

                匹配测试字符串:110102200012261251,测试通过

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第44张图片

               11010220001226125  不是合法的

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第45张图片

     – 匹配“微信”,“weixin”,“w x”等情况,并防止中间加空格

     – 不用防wechat

    答案:(微|w(ei)?)\s*(信|x(in)?)

    分析:(微|w(ei)?)汉字微或拼音wei,但是ei可有可无,\s*可能有空格,也可能没有空                      格, (信|x(in)?)汉字信或拼音xin,但是in可有可无

7. 指定匹配位置

  • 一个字符串中三个位置比较特殊:

       –1. 字符串开头

       –2. 字符串结尾

       –3. 英文句子中的每个单词中间的空白位置

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第46张图片

  • 如果只希望匹配特殊位置上的关键词时,就可用特殊符号表示特殊位置。
     
  • 包括:

       –1. ^ 表示字符串开头

       –2. $ 表示字符串结尾

​​​​​​​       –3. \b 表示单词边界,可匹配:空格,标点符号,字符串开头和结尾等可将一个单词与其它单           词分割开的符号。

  • 比如:

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第47张图片

  •  比如:匹配一组连续的空字符

       –1. 匹配任意一组连续的空字符   \s+

       –2. 仅匹配开头的空字符   ^\s+

        –3. 仅匹配结尾的空字符   \s+$

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第48张图片

        –4. 同时匹配开头和结尾的空字符:

       错误的做法: ^\s+$表示从开头到结尾之间只能是空字符     ^ …中间只能有空格… $

       正确做法: ^\s+|\s+$用“|”选择符,将整个规则强行一分为2     ^\s+ ↔️ \s+$

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第49张图片

 – 一个正则,从字符串开头开始向后匹配

 – 共经历过两次匹配的,发现字符串中有两组符合要求的空格

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第50张图片

执行过程如下: 

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第51张图片

  • 再比如: 找到每个单词首字母

                       ——前边紧挨着单词边界的字母

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第52张图片

  • 所以:\b[a-z]

  •  问题: 只写\b什么也匹配不到
     
  • 原因: 其实\b是”零宽”,只匹配位置,不匹配字符

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第53张图片

【JS高级】正则入门基础—关于你想知道的正则表达式_01_第54张图片

   ◼️ 使用特殊位置

  • 在RegExp Buddy中定义规则

   – 仅匹配字符串开头的空字符    ^\s+

   – 仅匹配字符串结尾的空字符    \s+$​​​​​​​           

   – 同时匹配字符串开头和结尾的空字符   ^\s+|\s+$

   – 匹配每个单词首字母   \b[a-zA-Z]
 

◼️ 练习:电子邮件的正则表达式

  • 使用正则匹配电子邮件

答案:\w+@\w+\.\w+(\.cn)?

分析:电子邮件的正则表达式
 

➡️ \w+  1个以上的合法字符

➡️ @ 必须有一个@

➡️ \. 必须有一个.但是.是通配符,要转义为\.

➡️ \w+ .后至少有一个后缀是一个以上的合法字符

➡️ \.cn 最后的.cn可有可无。

所以完整的邮箱正则表达式是:\w+@\w+\.\w+(\.cn)?

总结:知识点提炼 

⏬ 只要验证字符串格式或查找、屏蔽敏感词时都要用正则 ⏬

(1). 最简单的正则: 一个敏感词的原文

(2). 某一位字符上可能有多种备选字时用: [备选字列表]

(3). 如果[]中部分字符是连续的,可用: [x-x]

         a. 一位小写字母: [a-z]

         b. 一位大写字母: [A-Z]

         c. 一位字母(大小写都行): [A-Za-z]

         d. 一位字母或数字都行: [0-9A-Za-z]

         e. 一位汉字: [\u4e00-\u9fa5]

(4). 预定义字符集:

         a.  \d 一位数字

         b.  \w 一位数字、字母或_

         c.  \s  空格、tab、换行等空字符

         d.  .   任意字符

(5). 如果规定一个字符集或子规则反复出现的次数时就用量词:

         a. 有明确数量边界的量词:

      1). {n}  =n 必须n个,不能多也不能少

      2). {n,m}  n个<=    <=m个

      3). {n,}    n个<=   多了不限

         b. 没有明确数量边界的量词:

      1). *   0个<= 可有可无,多了不限

      2). ?   0个或1个  可有可无,最多一个

      3). +   1个<=  至少一个,多个不限

(6). 两个规则中选其一匹配即可: 规则1|规则2

(7).希望将多个子规则分为一组先联合匹配,再和分组外的其他规则联合匹配:

  (多个子规则)

(8). 匹配特殊位置: 3个

         a. 字符串的开头位置: ^

         b. 字符串的结尾位置: $

         c. 英文句子中的单词的左右边界: \b

如果这篇【文章】有帮助到你,希望可以给【青春木鱼】点个,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【前端技术】感兴趣的小可爱,也欢迎关注❤️❤️❤️青春木鱼❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】!  

你可能感兴趣的:(#,⭐️,JS高级教程,javascript,正则表达式,正则,前端,JS高级)