字符匹配攻略

  • 横向匹配——通过量词

      {m,n} {m,} {m} ? + *    贪婪匹配
      后面跟?号                惰性匹配
  • 纵向匹配——通过字符组

      \d \D \w \W \s \S .
      \w表示[0-9a-zA-Z_]
      \W表示[^0-9a-zA-Z_]
  • 分支结构——通过管道符"|"

    • 匹配模式也是惰性的

    • 当前面的分支匹配上了这个位置的字符,后面的分支就不再尝试,整个匹配从这个位置往后继续进行

位置匹配攻略

  • 匹配位置

    • ^ $ \b \B (?=p) (?!p)
  • 位置的特性

    • 对于位置的理解,我们可以理解成空字符""

括号的作用

  • 描述

    • 强调括号内的正则是一个整体,提供了可供我们使用的分组,即提供了子表达式
  • 分组引用

    • 需配合使用实现环境的API来使用

      str.match(reg)          ——通过结果数组大于0的下标来获取
      reg.exec(string)        ——通过结果数组大于0的下标来获取
      str.replace(regex,"$1") ——通过replace提供的$1,$2,$3...来获取捕获的分组
  • 反向引用

    • 在正则本身里引用分组的方式,通过\1,\2,\3...来引用分组内容

      • 括号嵌套 ——从外到内,从左到右

      • \10 ——代表捕获的第10个分组

      • 引用不存在的分组 ——代表"\数字"

      • 分组后有量词 ——捕获最后的匹配

  • 非捕获括号

    • 不被捕获的分组形式

      • (?:字符)

      • (?:字符1|字符2|字符3..)

回溯法原理

  • 没有回溯的匹配

    • 一次匹配到位
  • 有回溯的匹配

    • 一次匹配不行,就"退一步",再进行匹配,循环往复
  • 常见的回溯形式

    • 贪婪量词

    • 惰性量词

    • 分支结构

正则表达式的拆分

  • 编程语言都有操作符,正则表达式中的操作符则体现在结构中

  • 结构

    • 字符本身、字符组、量词、锚(位置)、分组、选择分支、反向引用
  • 操作符的优先级

    • 1——
    • 2——(…)、(?:…)、(?=…)、(?!…)、[…]

    • 3——{m}、{m,n}、{m,}、?、*、+

    • 4——^、$、\元字符、一般字符

    • 5——|

  • 注意点

    • 匹配字符串整体问题

      • 如果存在位置锚,可以通过分组括号进行操作优先级的改变,比如^和$
    • 量词连缀问题

      • 如果存在量词连缀,可以通过分组括号分割,避免报错
    • 元字符转义问题

      • 需要转义的时候最好都转义

正则表达式的构建

  • 平衡法则

    • 匹配预期的字符串

    • 不匹配非预期的字符串

    • 可读性和可维护性

    • 效率

  • 构建前提

    • 是否适合

    • 是否必要

    • 是否需要复杂的正则(可拆分)

  • 准确性

    • 确定匹配目标的所有模式规则,进行拆分,提取和分组
  • 效率

    • (减少回溯)明确字符组,避免模糊匹配

    • (节省内存)如果不需要利用捕获组,应该使用非捕获型分组

    • (加快移位速度)独立出确定字符

    • (消除重复)提取分支公共部分

    • (减少回溯)控制分支的数量

正则表达式的编程

  • 四种操作

    • 验证

    • 切分

    • 提取

    • 替换

  • 相关api

    • String——search

    • String——split

    • String——match

    • String——replace

    • RegExp——test

    • RegExp——exec

  • 注意点

    • search和match会把字符串转换为正则(匹配"."的时候需改写为"\.")

    • split中的正则分组会被包含进结果数组

    • 换行修饰符m,针对的是^和$的位置

    • 构造函数用法对于元字符和转义字符需要多再加一个斜杠""

    • test方法代表有部分匹配即可,因此整体匹配需要使用^和$进行控制

    • macth的调用,如果正则带g,则不会返回标准信息

    • exec的调用,始终都会返回标准信息

    • 字符串的4个方法,每次匹配,都是从0开始的

    • 正则实例的2个方法,每次匹配,都会修改lastIndex,遵从lastIndex

    • 正则构造函数的静态属性基于所执行的最近一次正则操作而变化

    • 正则构造函数的使用基于动态和需要变化的正则形式

《javascript正则表达式迷你书》笔记的更多相关文章

  1. HTML+CSS笔记 CSS笔记集合

    HTML+CSS笔记 表格,超链接,图片,表单 涉及内容:表格,超链接,图片,表单 HTML+CSS笔记 CSS入门 涉及内容:简介,优势,语法说明,代码注释,CSS样式位置,不同样式优先级,选择器, ...

  2. CSS笔记--选择器

    CSS笔记--选择器 mate的使用 <meta charset="UTF-8"> <title>Document</title> <me ...

  3. HTML+CSS笔记 CSS中级 一些小技巧

    水平居中 行内元素的水平居中 </a></li> <li><a href="#">2</a></li> &l ...

  4. HTML+CSS笔记 CSS中级 颜色&长度值

    颜色值 在网页中的颜色设置是非常重要,有字体颜色(color).背景颜色(background-color).边框颜色(border)等,设置颜色的方法也有很多种: 1.英文命令颜色 语法: p{co ...

  5. HTML+CSS笔记 CSS中级 缩写入门

    盒子模型代码简写 回忆盒模型时外边距(margin).内边距(padding)和边框(border)设置上下左右四个方向的边距是按照顺时针方向设置的:上右下左. 语法: margin:10px 15p ...

  6. HTML+CSS笔记 CSS进阶再续

    CSS的布局模型 清楚了CSS 盒模型的基本概念. 盒模型类型, 我们就可以深入探讨网页布局的基本模型了.布局模型与盒模型一样都是 CSS 最基本. 最核心的概念. 但布局模型是建立在盒模型基础之上, ...

  7. HTML+CSS笔记 CSS进阶续集

    元素分类 在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素.内联元素(又叫行内元素)和内联块状元素. 常用的块状元素有: <div>.<p>.<h1&g ...

  8. HTML+CSS笔记 CSS进阶

    文字排版 字体 我们可以使用css样式为网页中的文字设置字体.字号.颜色等样式属性. 语法: body{font-family:"宋体";} 这里注意不要设置不常用的字体,因为如果 ...

  9. HTML+CSS笔记 CSS入门续集

    继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代(标签). 语法: p{color:red;} <p> ...

  10. HTML+CSS笔记 CSS入门

    简介: </span>年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的<span>脚本解释程序</span>,作为ABC语言的一种继承. & ...

随机推荐

  1. linux入门系列13--磁盘管理之RAID、LVM技术

    前一篇文章学习了磁盘分区.格式化.挂载等相关知识,本文将讲解RAID和LVM技术. 磁盘管理操作主要是运维人员用的较多,如果只是单纯的开发人员,可以先略过本文.但是在很多小公司里往往都是一人多用,运维 ...

  2. Vue生命周期和钩子函数及使用keeplive缓存页面不重新加载

    Vue生命周期 每个Vue实例在被创建之前都要经过一系列的初始化过程,这个过程就是vue的生命周期,在这个过程中会有一些钩子函数会得到回调 Vue中能够被网页直接使用的最小单位就是组件,我们经常写的: ...

  3. a标签没有闭合引起自动插入很多a标签的问题

    a标签中间没有内容的情况下,很容易忽略闭合 a标签一定要闭合,否则会在后面每个div后面插入同一个a标签 要以如下形式闭合: <div class="v5-index-containe ...

  4. Linux内存管理解析(二) : 关于Linux内存管理的大体框架

    什么是内存管理 ? 首先内存管理管理的主要对象是虚拟内存,但是虚拟内存对应的映射主要为物理内存,其次也可能通过交换空间把虚拟内存与硬盘映射起来,既然如此,那我们先了解物理内存的管理. 对于物理内存而言 ...

  5. linux文件系统相关命令(df/du/fsck/dumpe2fs)

    一.文件系统查看命令df 格式 df [选项] [挂载点] 选项 名称 作用 -a 显示所有的文件系统信息,包括特殊文件系统,如/proc,/sysfs -h 使用习惯单位显示容量,如KB,MB或GB ...

  6. Shiro -- (三) 自定义Realm

    简介: Realm:域,Shiro 从从 Realm 获取安全数据(如用户.角色.权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定 ...

  7. Linux部署.NetCore站点 使用Supervisor进行托管部署

    前言 之前终于在Linux上部署好了.NetCore站点,但是这个站点非常“脆弱”.当我的ssh连接关闭或者我想在当前连接执行其他命令时候就必须关闭dotnet站点的执行程序.这显然不是我想要达到的效 ...

  8. mysql必知必会--用通配符进行过滤

    LIKE 操作符 前面介绍的所有操作符都是针对已知值进行过滤的.不管是匹配一 个还是多个值,测试大于还是小于已知值,或者检查某个范围的值,共 同点是过滤中使用的值都是已知的.但是,这种过滤方法并不是任 ...

  9. You (oracle) are not allowed to use this program (crontab)

      检查一台ORACLE数据库服务器的crontab作业(用户为oracle,实际环境中可能为oracle.也有可能是其它用户)时,发现出现下面提示信息: $ crontab -l You (orac ...

  10. Centos7内核版安装nginx环境问题及解决方法

    错误信息:./configure: error: C compiler cc is not found解决方案:yum -y install gcc gcc-c++ autoconf automake ...