带你进入正则的世界 /(^_^)/
发布日期:2022-02-22 16:04:50 浏览次数:12 分类:技术文章

本文共 3156 字,大约阅读时间需要 10 分钟。

RegExp 知识大纲:

在这里插入图片描述

一、正则的组成

1.1 结构

字符字面量:包括转义字符和非转义字符
字符组:匹配一个字符,多选一 eg: [0-9] 简写:\d
反义字符组:[^0-9] 匹配非数字字符 简写:\D
量词:字符连续出现的次数。 {m,n}
{1,} 可以简写为 + (至少一次)
{0,1} 可以简写为 ?
{0,} 可以简写为 *
:表示位置 。 ^ 表示开头 $ 表示结尾 \b 单词边界 先行断言
分组:捕获分组()、 非捕获分组(?:)
分支:abc | bcd 、 反向引用 \2 表示引用第二个分组

1.2 操作符

转义符:
括号和方括号 : () (?:) (?=) [ ]
两次限定符:{m} {m,n} {m,} ? + *
位置和序列:^ $
管道符: |

操作符优先级:从上到下,由高到低

1.3 注意要点
  • 元字符^、$、.、*、+、?、|、\、/、(、)、[、]、{、}、=、!、:、- ,转义,字符组相关的元字符转义
  • 量词 {,n} 不会报错
  • ( ) 前后括号都要转义
1.4 应用

身份证号:15位连续数字 或 17位数字 + x/X

  • /^( \d{15} | \d{17}[ \dxX])$/

IPV4地址 :xxx.xxx.xxx.xxx xxx的范围[0,255]

二、字符匹配

  • \d 匹配一个数字 [0-9] digital 数字 \w (word) 匹配一个常用字符,包括字母数字下划线 [A-Za-z0-9_]
  • \s (space) 表示匹配一个空白字符,包括空格,tab(\t),回车键(\n)打出来的空格, [\t\n\r\v\f](制表,换行,回车,垂直制表符,空格) 将字母换成大写 表示相反的意思 \D 表示 非数字
  • 占位符 . 可以匹配任意字符。\. === [^\r\n] 能够匹配所有单个字符,除了行结束符,和换行
  • 表示任意字符可以使用 [\d\D]、[\w\W]、[\s\S] 和 [^] 任意一个
2.1 模糊匹配
  • 横向模糊匹配 :匹配多个字符 {m,n}
  • 纵向模糊匹配:从多个字符中匹配一个 [m-n]
2.2 贪婪匹配 & 惰性匹配
  • 贪婪匹配:尽可能多的匹配
  • 惰性匹配:尽可能少的匹配。在量词后面加个问号就能实现惰性匹配。eg: /\d{2,4}?/g
2.3 应用

在这里插入图片描述

三、位置匹配

划重点 :位置可以理解为空字符串 (“”), 位置可以替换成字符

3.1 正向先行断言和负向先行断言

(?=p) 匹配p前面的位置
(?!p) 匹配 不是p的字符 前面的位置

3.2 单词边界 & 非单词边界

\b 单词边界:\w 与 \W之间的位置,包括\w 与 ^ 之间的位置 ,和\w 与 $之间的位置
\B 非单词边界:具体说来就是 \w 与 \w、 \W 与 \W、^ 与 \W,\W 与 $ 之间的位置

3.3 应用

在这里插入图片描述

不匹配任何东西的正则:/.^/ 要求只有一个字符,但该字符后面是开头,而这样的字符串是不存在的。

四、括号的作用

4.1 捕获型括号

括号,会捕获他们匹配到的数据,以便后续引用

分组引用:在匹配过程中,给每一个分组都开辟一个空间,用来存储每一个分组匹配到的数据。$1-$9 提取数据
反向引用:\1 引用第一个分组匹配到的字符

4.2 非捕获括号

非捕获括号 (?:p) (?:p1|p2|p3) 只有括号最原始的功能,不会引用它,既不在API里引用,也不在正则里反向引用

4.3 注意要点
  • 括号嵌套以左括号为准
  • \10 表示第10个分组
  • 引用不存在的分组,不报错,只是匹配反向引用的字符本身
4.4 应用

在这里插入图片描述

五、回溯法原理

本质:深度优先算法

常见回溯形式

  • 贪婪量词
    虽然局部匹配时贪婪的,但也要满足整体能正确匹配。
    如果多个贪婪量词挨着存在,并相互有冲突时,先下手为强(因为深度优先搜索)

  • 惰性量词:惰性量词就是在贪婪量词后面加个问号,表示尽可能少的匹配。

  • 分支结构

六、正则表达式的构建

6.1 构建正则的前提
  1. 准确性:针对每种情形,分别写出正则,然用分支把它们合并在一起,再提取分支公共部分,就能得到准确的正则。
    效率。
  2. 使用具体型字符组来代替通配符,来消除回溯
    不需要使用分组引用和反向引用时,使用非捕获型分组;(捕获型分组需要内存保存匹配到的数据)
  3. 独立出确定字符 /a+/ 可以修改成/aa*/ 会在第四步中,加快判断是否匹配失败,进而加快移位的速度。
  4. 提取分支公共部分,可以减少匹配过程中可消除的重复
  5. 减少分支的数量,缩小他们的范围。此时分支和量词产生的回溯的成本是不一样的。但这样优化后,可读性会降低的。
6.2 平衡法则
  • 匹配预期的字符串
  • 不匹配非预期的字符串:正则无法匹配“1010010001…”字符串
  • 可读性和可维护性:可以将复杂的正则拆分成多个小正则来匹配
  • 效率

能用字符串API解决的问题,就不该用正则eg:提取日期中的年月日可以用split(),获取子字符串可以用subString() subStr()

七、正则表达式编程

在这里插入图片描述

7.1 2种创建方式
var reg=/abc/修饰符;  (正则表达式直接量)var reg=new RegExp(“abc”,”修饰符”);

var reg1=new RegExp(reg);//reg1,reg是两个不同的对象
var reg1= RegExp(reg);//返回reg的引用。reg1,reg是两个相同的对象

7.2 修饰符(只读属性)
  • I (ignore)忽视大小写;
  • g(global) 全局匹配;
  • m-(multiline)多行匹配,只能影响 ^ $ ,二者变成行的概念,即行开头和行结尾。
7.3 正则对象的属性

lastIndex,source(在构建动态的正则表达式时,可以通过查看该属性,来确认构建出的正则到底是什么)

构造函数的静态属性:RegExp.$1 … $9
不常用的属性(有兼容性问题):
在这里插入图片描述

7.4 实例方法

RegExp 的方法

test,exec。exec 方法能接着上一次匹配后继续匹配,其中正则实例 lastIndex 属性,表示下一次匹配开始的位置。在使用 exec 时,经常需要配合使用 while 循环。

  • reg.test(str);//看目标字符串中是否有子串,部分匹配即可。如果要整体匹配,正则前后需要添加开头和结尾,返回 true/false

  • reg.exec(‘str’) 返回数组类型,存放的是匹配成功的结果,不匹配-》null;返回结果和str.match() 相同,也可以使用构造函数的全局属性 $1 至 $9 (指相应的分组)来获取

  • reg.source; 返回正则表达式/ /中间的内容

字符串实例方法

search,split,match,replace参数都支持正则和字符串。每次匹配时,都是从 0 开始的,即 lastIndex 属性始终不变。
search,match会把字符串转换为正则。

  • str.search(reg);//返回首次匹配成功的位置,匹配失败返回-1
  • str.match(reg)//全局匹配返回所有匹配组成的数组;没有修饰符时,返回的一个数组,第一个元素是整体匹配结果,然后是各个分组(括号里)匹配的内容,然后是匹配下标,最后是输入的文本。
  • str.replace(reg,’#’)// 将正则匹配的字符替换为# 字符串没有全局匹配功能,只能替换一个
  • str.split(reg);用正则匹配的字符 来 截取字符串; 可以有第二个参数,表示结果数组的最大长度; 正则使用分组时,结果数组中是包含分隔符的。

[参考] JavaScript 正则表达式迷你书-老姚

转载地址:https://blog.csdn.net/Conradine_Lian/article/details/108890595 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:windows10远程桌面——函数不受支持,这可能是由于 CredSSP 加密 Oracle..
下一篇:CSS拾遗篇之定位体系和包含块 & html,body 的探究

发表评论

最新留言

关注你微信了!
[***.191.171.41]2022年10月05日 15时59分48秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章

蓝牙4.0技术 2020-01-25 18:17:50
蓝牙核心规格 2020-01-25 18:17:50
转C#窗体无法接受Keydown事件 2020-01-25 18:17:50
DotNetBar grid筛选 按时间筛选 2020-01-25 18:17:50
如何在linux 服务器上新建用户 2020-01-25 18:17:50
猴子分香蕉 2020-01-25 18:17:49
scanf输入空格 2020-01-25 18:17:49
1.简单使用两片74HC595实现动态显示数码管 2020-01-25 18:17:49
oracle表大小 2020-01-25 18:17:49
算法图解第一章_二分查找_python 2020-01-25 18:17:49
[linux]makefile多目录 2020-01-25 18:17:49
如何解决Renesas USB3.0RootHub警告 2020-01-25 18:17:49
mysql-font1251错误 2020-01-25 18:17:48
JSP入门 2020-01-25 18:17:49
已加载"C:\Windows\SysWOW64\msvcp120d.dll".无法查找或打开 PDB 文件. 2020-01-25 18:17:48
杨辉三角形 2020-01-25 18:17:48
2.在窗口中添加按钮 2020-01-25 18:17:47
3.窗口的大小标题图标设置 2020-01-25 18:17:47
5.从零开始创建一个QT窗口按钮 2020-01-25 18:17:48
4.标准信号与槽 2020-01-25 18:17:48