美文网首页
最容易理解的正则表达式笔记

最容易理解的正则表达式笔记

作者: Dargonfly429 | 来源:发表于2018-06-18 14:24 被阅读0次

    正则表达式

    正则是‘某种模式去匹配一类字符串的一中公式’,正则是独立于语言存在的,java,php,js,py,linux都支持

    阅读本文的时候可以打开正则在线测试工具练习

    简单正则

    我们先看个简单正则的例子:
    /^\d{5,8}\w+$/i
    正则由

    • 分隔符(/)
    • 表达式(^\d{5,8}\w+$)
    • 适配模式(i)

    三部分组成,

    表达式又由

    • 表示位置的符号(^ $)
    • 元字符(\d \w)
    • 量词({5,8} +)

    组成,所以我们需要知道每个部分都能怎么写,然后组合起来就ok了。

    分隔符

    分隔符可以是除了数字 字母 下划线 反斜线以及空白符以外的任何字符,我们常用的有/ # ~ !等,其实正斜线可读性不好,在分析html时还会跟结束标签冲突,推荐用#;

    位置

    位置 说明
    ^ 匹配字符串开始
    $ 匹配字符串结尾
    \b 匹配单词的边界
    \B 匹配单词的非边界

    元字符

    元字符 说明
    . 任意字符,不含换行!
    \w [a-z A-Z 0-9 _]
    \s 空白符
    \d [0-9]
    --- ---
    \S 非空白符
    \W \w的补集
    \D 非数字
    --- ---
    - 表示范围
    [] 表示括号中的任意一个字符
    [^] 表示不是括号中的任意一个字符

    量词

    量词
    * 匹配零次或多次
    匹配零次或一次
    + 匹配一次或多次
    {n} 匹配n次
    {n,} 匹配至少n次
    {n,m} 匹配n-m次

    模式

    模式
    模式修饰 -
    i 忽略大小写
    m 多文本
    s 单文本
    x 忽略空白

    另外:

    经验之谈
    .* 表示任意字符,但是不包括换行,你可以先把字符串处理一下,替换掉换行
    [\s\S] 表示任意字符,包括换行

    转义:

    当我们要表示的元字符跟正则语法里使用的符号冲突时,就需要转义
    比如 \. \* \? \\
    如果有好多要一起转义那可以用\Q....\E 中间的部分都会被转义

    正则其实不难,看完简单正则,写个匹配电话号码什么的都可以了。

    正则进阶

    其实正则博大精深,简单正则能处理的场景还是少,我们来学习一些高级的

    分支 竖线

    看例子吧
    如果你要匹配cat hat fat,可以怎么写?答案是#^[chf]at$,
    那我们再加一个flat呢?#^[chfl]at$#这么写肯定不行。
    答案是#^(c|h|f|fl)at$#
    括号里面会当作一个整体来处理,竖线表示这几个都可以选。

    分组

    三个重复的a可以用a{3}来表示,那按abc重复三次怎么写?
    答案是(abc){3},括号里就是分组,会被当做一个整体。
    另外,括号还有另外一个做用,就是被括号里面的规则匹配到的对应的字符串会被存起来,我们可以用特定的语法读取。

    反向引用

    如果要你匹配go go,hei hei,这样的重复两次的单词,怎么写?
    你可能想到(\w+){2},这是不对的,这样第一组是第一个字母,第二组是剩下字母,
    我们需要一个方法能够获取到第一个分组,这就是反向引用。
    答案是\b(\w+)\b\s+\1\b,\1表示前面括号的内容。
    还可以这么写\b(?<word>\w+)\b\s+\k<word>\b,看得出来就是给分组命名了。

    其实这还是分组的延伸,我们可以写好几个括号,我们就可以提取到字符串的特定的部分。

    分组也叫捕获,捕获和读取分组还有一些语法,我列一下

    语法 说明
    (exp) 匹配exp,并将捕获的内容放到自动命名的分组里,用\1\2来读取
    (?<name>exp) 匹配exp,并将捕获的内容放到自定义命名的分组里,用\k<name>来读取
    (?'name'exp) 同上
    (?:exp) 匹配exp,但是不会捕获的内容

    环视

    这个我没有办法用人话讲明白,我就简单列下语法,不说了。

    语法 说明
    (?=exp) 匹配exp前面的位置
    (?<=exp) 匹配exp后面的位置
    (?!exp) 匹配后面不是exp的位置
    (?<!exp) 匹配前面不是exp的位置

    贪婪/懒惰匹配模式

    请看题
    匹配以a开头以b结尾的字符,很好写a.*b,我用用来匹配aabab时,结果是aabab。
    为什么不是ab或者aab呢?
    因为正则默认是匹配尽可能多的字符串,也就是贪婪模式。
    我们这么写a.*?b,就能匹配到aab,在量词后面加?,就是懒惰模式,尽可能少。
    那为什么不是ab?不是更懒?正则还有一条规则,最先匹配到的优先级最高,aab比ab先匹配到。
    ...

    常用模式

    就是在表达式结尾加一个符号,以表示有特殊的匹配模式

    模式
    模式修饰 -
    i 忽略大小写
    m 多文本
    s 单文本 点通号
    U 懒惰模式
    D 结尾模式
    x 忽略空白

    例子懒得举了....自己搜索吧

    常用正则举例

    //手机号码校验
    ^1(3|5|8)\d{9}$
    //email
    ^\w+([-_.]\w+)*@\w+([-_.]\w+)*.\w+([-.]\w+)*$
    

    参考


    相关文章

      网友评论

          本文标题:最容易理解的正则表达式笔记

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