美文网首页程序员
正则表达式快速入门

正则表达式快速入门

作者: 菜鸟栖飞 | 来源:发表于2018-03-05 10:17 被阅读0次

    1. 正则表达式介绍

    1.1 概念解释

    正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
    以上百度百科抄袭【传送门

    1.2 引擎
    • DFA
    • 传统型NFA
    • POSIX NFA

    详细介绍还是继续看百度百科吧 (>﹏<) 【 传送门

    2. 正则表达式使用

    2.1 表达式总览
    总览表
    2.2 常用元字符
    2.2.1 内容性字符
    字符 理解
    .(点) 匹配任意单个字符。
    \w 单词字符,大多数情况下可等同[A-Za-z0-9_],有得引擎可匹配中文,有的不可以,如果在特殊情况下需要进行测试
    \d 数字,等同[0-9]
    \b 单词边界,即排除\w以外的字符
    \W \D \w, \d 互斥集合
    \s 空白字符,等价与[\f\n\r\t\v], 互斥集合\S
    2.2.2 功能性字符
    字符 理解
    [] 区间段,比如[A-Fa-f0-7]、[aui391],前后字符ascii码值大小不可颠倒。
    ^ 匹配字符开始的位置。 如果在[]里使用则表示匹配字符不再区间内,例如[^\d]标识匹配除\d以外的字符。
    $ 匹配字符的结束位置。
    +,?,* 表达式的出现次数或重复次数(不明确次数)。 +表示表达式出现1次或重复多次; ?表示表达式出现0次或1次; *表示表达式出现任意次数
    {n}, {n,m}, {n,} 表达式出现的次数(明确的次数)。{n}表示出现n次,{n, m}表示出现n到m次,{n,}出现大于n次
    \ 转义符
    () 分组获取,可使用$1...$99(最大数百度百科上是9)获取到分组匹配的结果,具体可以看总览表。
    逻辑或,表达式的顺序会影响匹配结果,会将最先匹配到的结果返回
    (?=pattern) 非获取匹配,匹配单词中的一部分,该匹配部分紧邻后部分需要符合pattern表达式
    (?!pattern) 非获取匹配,匹配单词中的一部分,该匹配部分紧邻后部分不符合pattern表达式
    (?<=pattern) 非获取匹配,匹配单词中的一部分,该匹配部分紧邻前部分需要符合pattern表达式
    (?<!pattern) 非获取匹配,匹配单词中的一部分,该匹配部分紧邻前部分不符合pattern表达式

    2.3 使用技巧

    正则表达式不支持逻辑计算。
    编写正则表达式的思路:

    1. 观察需要匹配的文本特点和规律。
    2. 尝试性编写正则表达式,由简入深的编写。
    3. 反复测试正则表达式和完善表达式。
    单次匹配

    单词列表

     house
     write
     first
     so
     these
     her
     long
     picture
     point
     animal
     again
     us
     try
    

    查找长度5,第二个字符是o的单词
    .o...(这样匹配的时候会匹配上部分文本,以下有解决方法)

    第二位是o或i的单词
    .[oi]...
    该表达式会匹配picture、animal的部分,解决这个问题可以在表达式两边加上\b, 结果
    \b.[oi]...\b

    子表达式和重复匹配

    子表达式是表示一个复杂匹配的单元,使用()括起来的一组复杂的正则表达式。
    这里写一个正则来匹配正确的IP地址作为。
    ((\d|[12]\d|1\d\d|2[0-4]\d|25[0-5])\.)((\d|[12]\d|1\d\d|2[0-4]\d|25[0-5])\.)((\d|[12]\d|1\d\d|2[0-4]\d|25[0-5])\.)(25[0-5]|1\d\d|2[0-4]\d|[12]\d|\d)等价于
    ((\d|[12]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(25[0-5]|1\d\d|2[0-4]\d|[12]\d|\d)

    以上(\d|[12]\d|1\d\d|2[0-4]\d|25[0-5])((\d|[12]\d|1\d\d|2[0-4]\d|25[0-5])\.)是子表达式。

    回溯引用

    回溯引用需要将要匹配的表达式分组。以下给出两个示例。

    1. 匹配Html的中的h标签的文本段落
     <h1>h1段落</h1>
     <h1>h1段落</H1>
     <h2>h21段落</h1>
     <h2>h2段落</h2>
    

    正确匹配的正则表达式<([Hh][1-6])>.*</\1>其中\1就是回溯的([Hh][1-6])表达式。

    1. 查找文本中的相邻重复单词
      文本
    This is a block of of text, serveral words here are are repeated, and and they should not be.
    

    表达式[ ](\w+)[ ]+\1,会 将以上文本中的of ofare areand and查找出来。

    1. 回溯替换,以下使用js代码作为示例了
     var str = '2016-02-16';
     var reg = /(\d{4})-(\d{2})-(\d{2})/;
     var ret = str.replace(reg, "$1-$3-$2");
     console.log(ret);
    
    贪婪匹配和非贪婪匹配

    贪婪匹配,尽可能多的匹配文本,正则表达式默认启用的就是贪婪模式, +和都是贪婪匹配的字符;而非贪婪匹配,则是尽可能少的匹配文本,启用非贪婪模式则使用*?。

    文本aaaaa
    使用a+(贪婪模式)则会匹配整段文本
    而使用a+?只则匹配文本中的单个a字符;

    html <div>第一段文本html内容</div><div>第二段html内容</div>
    <div>.*</div>表达式会匹配整段代码,即贪婪模式。
    <div>.*?</div>表达式只会匹配 <div>第一段文本html内容</div>,即非贪婪模式。

    相关文章

      网友评论

        本文标题:正则表达式快速入门

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