美文网首页
正则表达式速记

正则表达式速记

作者: 克罗地亚催眠曲 | 来源:发表于2018-08-17 16:24 被阅读19次

    正则表达式,这个技能一直没有get,每次需要用的时候都是网上搜一下然后实现相应的功能,就没再研究下去。今天有机会仔细看了一篇网上的良心教程,在此记录下来其中重要的知识点。另外,给regexlab这个网站打call。http://www.regexlab.com/zh/regref.htm

    普通字符匹配,举例:
    表达式"c"在匹配字符串"abcde"时,匹配结果是成功,匹配到的位置是开始于2,结束于3。
    表达式"bcd"在匹配字符串"abcde"时,匹配结果是成功,匹配到的内容是"bcd",匹配到的位置是开始于1,结束于4.

    转义字符
    \r, \n, 代表回车符和换行符
    \t,代表制表符
    \,代表""本身

    能够与“多种字符”匹配的表达式
    \d 匹配任意一个数字,0~9中任意一个
    \w 任意一个字母或数字或下划线,也就是AZ,az,0~9,_中任意一个
    \s 匹配空格、制表符、换页符等空白字符中的任意一个
    . 可匹配除了换行符以外的任意一个字符

    自定义能够匹配“多种字符”的表达式
    [ab5@] 匹配a或b或5或@
    [^abc] 匹配a,b,c之外的任意一个字符
    [f-k] 匹配f~k之间的任意一个字母
    [^A-F0-3] 匹配A~F, 0~3之外的任意一个字符

    修饰匹配次数的特殊符号
    {n} 表达式重复n次
    {m,n} 表达式至少重复m次,最多重复n次
    {m, } 表达式至少重复m次
    ? 表达式重复0次或1次

    • 表达式至少出现一次
    • 表达式不出现或者出现任意次,相当于{0,}

    其它一些代表抽象意义的特殊符号
    ^ 与字符串开始的地方匹配,不匹配任何字符
    $ 与字符串结尾的地方匹配,不匹配任何字符
    \b 匹配一个单词的边界,也就是单词和空格之间的位置,不匹配任何字符

    一些符号可以影响表达式内部的子表达式之间的关系
    | 左右两个表达式之间“或”关系,匹配左边或者右边
    () 在被修饰匹配次数的时候,括号中的表达式可以被整体修饰,取匹配结果的时候,括号中的表达式匹配到的内容可以单独得到

    贪婪模式
    \w+, *, {m,n}在匹配的时候总是尽可能多的匹配符合它规则的字符,在可匹配可不匹配的时候,也是尽可能匹配,这种匹配原则叫做贪婪模式。
    举例:
    (d)(\w+)匹配dxxxdxxxd,匹配结果成功,共一个匹配结果,匹配位置开始于0,结束于8。

    非贪婪模式
    在修饰匹配次数的特殊符号后再加上一个"?",则可使匹配次数不定的表达式尽可能少的匹配,这种匹配的原则称为非贪婪模式,也叫勉强模式。
    举例:
    (d)(\w+?)匹配dxxxdxxxd,匹配结果成功,第一个匹配结果是dx,匹配位置开始于0,结束于1,第二个匹配结果是dx,匹配位置开始于4,结束于5。

    反向引用
    表达式在匹配时,表达式引擎会将小括号"()"包含的表达式所匹配到的字符串记录下来,在表达式后边的部分可以引用前面括号中匹配到的内容。引用方法是""加上一个数字,"\1"表示引用第一对括号内匹配到的字符串,"\2"引用第二对括号匹配到的字符串。嵌套括号的情况,按照左括号出现的顺序排序。
    举例:
    "('|")(.?)(\1)"在匹配" 'hello' , "world" "时,匹配结果成功,匹配到的内容是'hello',和 "world"
    "<(\w+)\s
    (\w+(=('|").?\4)?\s)>.?</\1>"在匹配<td id='td1' style="bgcolor:white"></td>时,匹配结果是成功。

    预搜索,不匹配
    "(?=xxxxx)" 所在缝隙的右侧,必须能够匹配xxxxx表达式
    举例:
    "Windows (?=NT|XP)"在匹配"Windows 98, Windows NT, Windows 2000"时,将只匹配Windows NT中的Windows,其他的Windows字样则不被匹配。
    "(\w)((?=\1\1\1))+"在匹配字符串"aaa ffffff 999999999"时,可以匹配6个f中的前四个,可以匹配9个9中的前7个。这个表达式可以解读为:重复4次以上的字母数字,则匹配其剩下最后两位之前的部分。

    "(?!xxxxx)" 所在缝隙的右侧,必须不能匹配xxxxx表达式
    举例:
    "((?!\bstop\b).)+"在匹配"fdjka ljfdl stop fjdsla fdj"时,将从头一直匹配到"stop"之前的位置,如果字符串中没有"stop",则匹配整个字符串。匹配结果有两个,第一个匹配结果"fdjka ljfdl "和"top fjdsla fdj"

    反向预搜索,不匹配
    "(?<=xxxxx)" 所在缝隙的左侧,必须能够匹配xxxxx表达式
    "(?<!xxxxx)" 所在缝隙的左侧,必须不能匹配xxxxx表达式
    "(?<=\d{4})\d+(?=\d{4})" 在匹配"1234567890123456"时,将匹配除了前4个数字和后四个数字之外的中间8个数字。

    相关文章

      网友评论

          本文标题:正则表达式速记

          本文链接:https://www.haomeiwen.com/subject/yjazbftx.html