正则表达式

. 匹配任意字符
正则表示的是一个组合,配合任意一个非断行字符
.转义
\w 表示文字和大小写字母_
\W 表示\w的反向匹配字符
\d 表示匹配阿拉伯数字
\D 匹配非数字
\s 空格,tab,换行
\S 非
[] 匹配[]中的任意一个值,也可以是范围,如果想匹配中文,可以使用中文的unicode
\u4e00-\u9fa5,\u表示是万国码unicode,4e00和9fa5表示中文文字之间的范围,给定的是一个unicode范围,[ab]a或者b
+表示前面的字符可以出现一次或者多次
[ab][cd]+表示方括号的唯一值可以出现一次或多次,a或者b表示唯一的值
.在括号中要转义

  • 表示0次或者多次
    ?表示0次或者1次
    {} 表示匹配字符的重新字数
    分组匹配
    使用()进行分组 1 表示第一组2 表示第二组
    贪婪,尽可能的多
    a.b aabaaab => aabaaab 默认是贪婪模式,.会尽可能多的去匹配组,尽可能多的去匹配。
    a.
    ?b aabaaaab => aab 尽可能少的去匹配,尽可能少的去匹配
    在匹配次数后面加问号,表示懒惰 *?重复任意次,尽可能少的重复。+?重复一次或更多次,尽可能少的重复。??重复0或者1次,但尽可能少的重复。
    位置符
    ^ $ ?=x \b \B
    12332132 => 12.332.132

首先我们需要在两个位置中插入两个点,所以需要找出这两个位置,位置都出现在了三个数字的前面,并且还需要从后往前匹配,所以需要匹配行尾部
/(?=\d{3})+/g \B就是\b的反面,\b是\w与\W之间的位置,具体来说就是\w \w \W \W \W ^之间的位置,位置和元素之间也可以匹配位置。
(?=p) 其中p是一个子模式,即p前面的位置
(?!p) 不是p前面的位置

位置的特性

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

  • 不匹配任何东西的字符
    /.^/ 开头的位置前面是没有字符的
  1. 弄出最后一个分号12131232
    (?=\d{3}) 匹配的是\d{3}前面的位置,\d{3}则表示正则的最后三位
    弄出所有的逗号
    (?=(\d{3})+) , 因为逗号出现的位置,要求后面3,6,9,12数字的前面出现,一旦出现3的倍数就进行替换 字符串首位不能出现,(?!^)(?=(\d{3})+)
    (?!\b)(?=(\d{3})\b)
    格式化
    把字符串1888 => 1,888.00 function format(num) { return num.toFixed(2).replace(/\B(?=(\d{3})+\b)/g, ',').replace(/^/, ' ');
    }
    验证密码的问题
    是否包含某种字符
    判断是否包含数字,将字符串中的所有位置找出来(?=.\d)判断这个位置的后一个字符是否是数字,如果存在这样的匹配,那么说明字符串中有数字
    位置匹配的字符串往往放在字符串的最前面
    (?=.
    \d)(?=.[a-z])
    (?=.
    [0-9])^,表示开头前面还有个位置

  2. 正则表达式括号的作用
    括号提供了分组,便于我们引用它。
    引用包括两种情形,一种在js里引用,另一种在正则里引用

分组与分支结构

  • 分组
    比如(ab)+()括号提供分组,使得+量词作用于()内部的整体,即提供子表达式。
    |分支往往要搭配分组括号使用

  • 分组引用
    正则引擎在匹配的过程中,会给每一个分组开辟一个空间,用来存储每个分组的数据。
    match返回一个数组,第一个元素是整体匹配结果,然后是各个分组匹配的内容,然后是匹配下标,是否有修饰符g,match返回的结果也不一样

同时也可以通过正则构造函数的全局属性来获取分组
只要执行正则操作即可,比如test,exec,match
RegExp.1 RegExp.2

let regex = /(\d{4})-(\d{2})-(\d{2})/
let string = '2019-08-09'
string.replace(regex, '$1/$2/$3')
== 
string.replace(regex, () => RegExp.$1 + '/' + RegExp.$2 + '/' + RegExp.$3)
string.replace(regex, (match, year, month, day) => )
正则被执行后会保存分组,分组通过全局的正则函数RegExp访问,
replace的第二个参数可以是回调函数,回调函数的第一个参数是正则匹配到的值,后面的参数是分组
  • 反向引用
    除了使用相应的api引用分组,也可以在正则本身里引用分组。但是只能引用之前出现的分组。既反向引用。
    /\d{4}(-|/|.)\d{2}(-|/|.)\d{2}/
    /\d{4}(-|/|.)\d{2}\1\d{2}/
    \1 \2 在正则里分别代表第一个和第二个分组
    分组会将匹配到的内容提取出来,保存到内存中

1.如果引用了不存在的分组,就会反向匹配引用字符本身

  1. 如果分组后面有量词,那么最终捕获到的数据是最后一次的匹配
    之前文中出现的括号,都会捕获他们匹配到的数据,以便后续引用,因此也称捕获行分组,如果只是使用括号里最原始的功能,(?:xxx)
    字符串trim方法模拟
    /^\s|\s$/g 去掉首尾空格
    将每个单词的首字母转换为大写
    string.replace(/(\s|^)\w/g, (value) => value.toUpperCase())
    驼峰转换
    string.replace(/-(\w)/g, (value, group1) => group1.toupperCase())
    html转义
const escapeHTML = (str) => {
      const escapeChars = {
        '<': 'a'
      }
      return str.replace(new RegExp('[' + Object.keys(escapeChars).join('') + ']')
        (value) => escapeChars[value]
      )
}

/<([a-z]+)>.+</\1>/g

正则表达式的回溯法原理

内容:

  1. 没有回溯的匹配
  2. 有回溯的匹配
  3. 常见的回溯形式

回溯法也称试探法,从问题的某一种状态出发,探索从这种状态出发所能达到的所有状态,当一条路走到尽头的时候,再后退一步或者若干步,从另一种可能的状态出发,继续搜索,直到所有的可能都被探索过。这种不断前进不断回溯的方法就叫回溯法。本质上就是深度优先搜索算法,其中退到之前某一步的过程,我们称为回溯

  • 贪婪量词
    比如b{1, 3}因为其是贪婪的,尝试可能的顺序是从多往少的方向去尝试,首先尝试bbb,然后看整个正则能否匹配,不能匹配时,吐出一个b,再继续尝试,往复循环,直到满足要求。

  • 惰性量词
    惰性量词就是在贪婪量词后面加一个?

  • 分支结构
    分支结构也是惰性的,比如/can|candy/,得到的结果是can,因为分支会一个一个尝试,如果满足了就不会在尝试后面的分支。
    非捕获分组?
    当尝试匹配时,需要确定从哪一个位置开始匹配,一般都是从字符串的开头
    当使用test和exec方法,且正则有g时,起始位置是从正则实例的lastIndex位置开始。

优化正则性能

  1. 通过使用非捕获型分组提升性能
  2. 独立出确定字符
  3. 提取分支公共部分
  4. 减少分支的数量,缩小它们的范围

正则表达式的四种操作

  1. 验证
    match返回结果的格式问题,分为是否有g两种情况
    没有g => [ 匹配的值,分组匹配的值,匹配开始的位置,需要匹配的字符串 ]
    有g => 返回的是所有匹配的内容
    当没有匹配时,不管有无g,都返回null
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容

  • 正则表达式是匹配模式,匹配字符或者匹配位置。 一、字符匹配 1.两种模糊匹配 1.1 横向模糊匹配 一个正则可匹配...
    菜菜的小阿允阅读 1,638评论 0 0
  • NSRegularExpression 正则表达式,又称正规表示法、常规表示法。(英语:Regular Expre...
    SunshineBrother阅读 7,434评论 3 25
  • 正则表达式有很多流派,也有很多的特性,不同的语言支持度也是不一样的。本篇文章是写Python中的正则表达式的用法的...
    Moscow1147阅读 1,094评论 0 0
  • 注:本篇文章只为方便查看,特此保留,如有冒犯,敬请谅解!!! 本文目标 30分钟内让你明白正则表达式是什么,并对它...
    阿杰Alex阅读 1,480评论 0 10
  • 人的一生,活法各异。没有统一的标准,条条大路通罗马,最终是赤条条的来,光溜溜的去。 但人是群居动物,会思维,善模仿...
    秦巴汉275e5477c13f阅读 1,164评论 13 14