正则

正则方法

    search() 方法 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。
    replace() 方法 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
    test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。
    exec() 方法用于检索字符串中的正则表达式的匹配。该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
    split() 用来把一个字符串拆分为多个子串的String方法。
    match() 用来匹配一个字符串的String方法。

正则规则

  • 通常情况下正则会返回第一个匹配结果
        g   (意思是'global',全局), 返回一个包含所有匹配结果的数组 
    
  • 通常情况下正则匹配区分大小写
        i   强制执行一次不区分大小写搜索
    
  • 英文.
        .   (英文句号),可以匹配任何一个单个字符、字母、数字、或者.本身。除了\符。
            可以连续出现,也可以以间隔形式出现。 
    
  • 元字符
        \   (转移符号)  这个符号有特殊含义,并不是字符本身的含义。
            [和] (匹配的字符集合)   只负责定义字符集合,字符集合的匹配结果是能够与该集合里的任意一个成员相匹配的文本。  
    
  • -(连字符)
        -   [0-9] [a-z] [A-Z]
            不能[3-1]这样写
            只有写在[和]里表示连接符,写下其他地方只表示普通字符,所以不用转义。 
    
  • 取非匹配[^]
        [^]     除去[]里匹配的字符 
        [^0-9]  匹配任何不是数字的字符
    
  • 空白字符串
        [\b]    回退(并删除)一个字符
        \f      换页符
        \n      换行符
        \r      回车符
        \t      制表符(Tab键)
        \v      垂直制表符
    
  • 字符类
        \d  任何一个数字字符
        \D  任何一个非数字字符
        \w  任何一个字母数字字符或下划线字符
        \W  任何一个非字母数字字符或下划线字符
        \s  任何一个空白字符
        \S  任何一个非空白字符
    
  • 匹配进制
        \x  十六进制前缀,\x0A对应ASCII字符10(换行符),与\n一样
        \0  八进制前缀,\011对应于ASCII字符9(制表符),与\t一样
    

重复匹配

  • [+ ,* ,? ,]
        +   匹配一个或多个字符。
        [0-9+]  表示匹配0-9之间的数组和+号字符。
    
        *   匹配零个或多个字符。
    
        ?   只能匹配一个字符(或字符处理)的零次或一次出现,只匹配前面的字符。
    
        {和}    可以设定重复次数。可以是重复的值,也可以是一个区间。
                {3}     刚好重复三次。
                {2,4}   重复2-4次。
                {2,}   至少重复两次。
    

贪婪型元字符和对应的懒惰型

  • 贪婪型元字符 匹配的越多越好

  • 对应的懒惰型 只匹配一个,适可而止

    贪婪型元字符 懒惰型元字符
    * *?
    + +?
    {n,} {n,}?

位置匹配

  • 单词边界
        \b  用来匹配一个单词的开始或结尾,它匹配的位置是\w和\W之间的位置。
        \B  不匹配一个单词边界。
    
  • 字符串边界
        ^   字符串开头
        $   字符串结尾
    

子表达式

  • (和)
        (和)    会被视为独立的元素
        (19|20) 19或20,|会把前后的看做一个整体
    

回溯引用

  • JS里使用\来标识回溯引用(\与$配合进行替换操作时例外)

        回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式
    
        [ ]+(\w+)[ ]+\1     \1的内容与(\w+)的一样
    
    -   回溯引用只能用来引用模式里的子表达式(用(和)阔起来的正则表达式)
    -   回溯引用匹配通常从1开始计数(如\1、\2,等等)。\0可以用来代表整个正则表达式。
    -   回溯引用也有不足之处,添加或删除子表达式,会使子表达式的相对位置改变。
    
  • 回溯中的替换操作

        $   $0代表整个正则匹配的
    
  • 大小写转换的元字符

    js好像没用

    元字符 说明
    \E 结束\L或\U转换
    \l 把下一个字符转换成小写
    \L 把\L到\E之间的字符全部转换为小写
    \u 把下一个字符转换为大写
    \U 把\U到\E之间的字符全部转换为大写
        var str = "<h1>abc</h1>"
        str1 = str.replace(/\<h1\>(.*?)\<\/h1\>/g,function(){
            let arr = [...arguments]
            console.log(arr);
            return arr[1].toUpperCase()
        });
        console.log(str1);
    

前后查找

  • 向前查找(向左查找)
        ?=  以?=开头的子表达式,需要匹配的文本跟在=的后面。
            会返回结果,只是这个结果的字节长度永远是0。
            长度是可变的。
    
  • 向后查找
        ?<= 可以把<=看做箭头,他指向文本阅读方向的后方。
            只是固定长度。
    

  • 查找操作符

    操作符符 说 明
    (?=) 正向前查找
    (?!) 负向前查找
    (?<=) 正向后查找
    (?<!) 负向后查找
        支持向前查找的,一般都支持正向前查找和负向前查找。向后查找也是如此。
        负向查找实际上是取非的作用。
        (?=\$)\d    以$开头的数字
        (?!\$)\d    不以$开头的数字
    
  • 非捕获性分组匹配

        ?:  非捕获性分组工作模式下分组(?:)会作为匹配校验,并出现在匹配结果字符里面,但不作为子匹配返回。
    
        捕获性分组:会返回结果以及其他子表达式所匹配的结果集合
        非捕获性分组:返回结果以及子表达式里没有?:的结果集合
    

    例:

        var str1 = '000aaa111';  
        var pattern = /([a-z]+)(\d+)/;       // 捕获性分组匹配
        var pattern2 = /(?:[a-z]+)(?:\d+)/;  // 非捕获性分组匹配
    
        console.log(pattern.exec(str1))     // 捕获性分组匹配结果    ['aaa111','aaa','111']
        console.log(pattern2.exec(str1))    // 非捕获性分组匹配结果  ['aaa111']
    

插入条件

  • 回溯引用条件

    回溯引用条件只在一个前面的子表达式搜索成功的情况下才允许使用一个表达式。

        ?(1)    1代表第几个子表达式(第几个括号),0代表整个正则表达式
    
        var reg = /(<[Aa]\s*[^>]*>)(?(1)\s*<\/[Aa]>)/;
        只有第一个括号里有匹配结果,即?(1)有值,才会继续它后面的匹配
    
  • 前后查找条件

    前后查找条件只有一个向前查找或向后查找取得成功的情况下才允许一个表达式被使用。

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