• 正则表达式


    http://regexr.com/

    是一个提供在线版的正则式编辑、学习、创建和测试的平台,帮助编程人员快速的编写正则表达式,内置多种转义字符,点击即可添加,同时还拥有在线保存和分享的功能。

    一、正则表达式 - 入门篇

    1.元字符
    .  匹配除结束符以外的任意字符,某些情况下不能匹配行起始符

    ^    匹配行的开始, 例如 ^The 匹配以The打头的行

    $    匹配行的结束,例如 home$匹配以home结尾的行,^$匹配空行

    ?  匹配0或1个任意字符

    *  匹配0到任意多个任意字符

    +  匹配1到任意多个任意字符

    {   量词起始符

    }   量词结束符

    [    字符组的起始符

    ]    字符组的结束符

        转义字符

    (  捕获分组的起始符

    )  捕获分组的结束符

    |  用或(or)的方法进行匹配

    2. 常用例子

    []  字符组

    ()  用于捕获分组

    {}  表示带查找的字符要重复的次数

    {n,}  代表前面的字符可以重复n到无穷多次

    {n1,n2}  代表前面的字符可以重复n1到n2次

    [0-9]  字符组,匹配数字0-9

    [^0-9]  字符组,对[0-9]取反,匹配非数字0-9的任意字符

    [+-*-]  字符组,代表加减乘除号

    d  数字字符,匹配任意阿拉伯数字,等同于[0-9]

    D  非数字字符,匹配任何一个非数字字符,即d 取反

    w  小写的w  单词字符,匹配字母、数字、下划线,即[_a-zA-Z0-9]

    W  大写的W 非单词字符,匹配非单词字符,即对小写w取反,即[^_a-zA-Z0-9]

    a  警告声音输出

      退格符

    c x 控制符

    f  换页符

      垂直的制表符

    v  小写v 水平的制表符

    V  大写V  非水平制表符

    h  水平空白符

    H  非水平空白符

      回车符

      换行符

      空字符

    s  小写s  匹配空白符,即,能匹配空格、制表符 、换行符 、回车符

    S  大写S  匹配非空白符,即小写s取反

    XXX  字符的八进制值

    x xx   字符的十六进制值

    u xxx  字符的Unicode值

    (?i)    匹配模式时不区分大小写

     (?i)the  匹配THE the The 等

    2. 举例:捕获分组

    将模式放入一对圆括号中,就是将它放进了分组,例如,(d)d

    3. 举例:非捕获分组

     非捕获分组(Non-capturing Group),不会将内容存储在内存中,因此该分组无法被引用,但也因此性能更好

    4. 举例:后向引用

    捕获分组后,后面可以用1对捕获的内容进行后向引用,例如,(d)d1,该模式可以匹配数字字符707,101,212, 505, 等等

    例子: (?:the|THE|The)

    5. 例子若干,自行体会,加强理解

    d+.?d* 匹配形如正整数、正小数的字符
    -?d+.?d* 匹配形如正整数、负整数、正小数、负小数的字符
    [^d+-*/().] 匹配这些字符以外的字符:数字字符、加减乘除号、正反括号、小数点
    [+-*/.]{2,} 匹配连续的加减乘除号、小数点
    [^()]*([^()]+)[^()]* 匹配配对的括号
    (([+-*/]*d+.?d*)+) 匹配最内层括号
    (.*)(d+.?d*)([*/])(d+.?d*)(.*) 匹配乘除法表达式
    (-?d+.?d*)([+-])(-?d+.?d*)(.*) 匹配加减法表达式

    二、正则表达式 - 进阶篇

    1.使用正在表达式为纯文本标签HTML5标签

    例如,sed -n 's/^/<h1>/;s/$/</h1>/p;q' rime.txt

    rime.txt中的文字将以h1格式(即所有字母大写)输出

    2. 边界

    断言,又称零宽度断言(zero-width assertion),用于标记边界,但不耗用边界上的字符,即字符不会返回到匹配结果中。零宽度断言不匹配字符,而是匹配字符串中的位置。例如^ $,也叫作锚位符(anchor)

    ^  匹配行的开始

    $  匹配行的结束

      匹配单词边界,表面上会匹配空格或起始行,实际匹配的是零宽度的不存在的东西

    B  匹配非单词边界,即 取反,例如,BeB 不会匹配字母e两边的字符,但会识别e两边是否是非单词边界(即,用于标记边界,但不会将边界返回到匹配结果中)

    可以用Q和E之间的字符集,匹配字符串的字面值。例如Q$E,会匹配$,而非行结束符,因为Q和E之间的任意字符都会被解释为普通字符。

    3. 量词匹配的三种模式:贪心、懒惰、占有

    a. 贪心模式:基本量词默认是贪心模式,如?,+,*,{m,n}

    首先匹配整个字符串,选定尽可能多的内容,如果匹配失败,就回退一个字符后再次尝试,这个过程叫做回溯(backtracking)。贪心模式,在匹配时每次回退一个,直到找到匹配的内容或没有字符可尝试为止,较另两种模式而言,贪心模式对资源消耗最大。先“吃”尽所有,然后每次“吐”出一点,慢慢咀嚼消化

    b. 懒惰模式: 在普通量词后添加?  量词就成为了懒惰模式 

    从目标的起始为止开始尝试匹配,每次检查字符串的一个字符,最后才尝试匹配整个字符串。每次只“吃”一点

    例子:对于字符串  55678

    5? 匹配2个5, 5?? 只匹配到第1个5,前者是贪心模式,后者是懒惰模式

    c. 占有模式:在普通量词后添加+  量词就成为了占有模式

    覆盖整个目标后再尝试寻找匹配内容,但只尝试一次,不会回溯,因此速度快。不“咀嚼”而是直接“吞咽”,然后才想知道“吃”的是什么

    例子:对于字符串 0000000

    0.*+  匹配到所有的0   .*+0  什么也没匹配到, 前者是占有模式(看起来跟贪心模式一样,但没有回溯,运行更快),后者也是占有模式,因为没有回溯,一下就选定了所有输入,不再回过来查看

    4. 环视:正前瞻、反前瞻、正后顾、反后顾

    a. 正前瞻:

    假设要匹配at,且要求紧随其后的单词是home,要到达这个目的,可以用正前瞻,格式如下:

    at(?=home)   注意只有模式的第一部分at被标亮了,环视部分(home)不会被标亮  

    b. 反前瞻:是对正前瞻取反,把=改成! 即 at(?!home)

    c. 正后顾:查看左边的内容,与正前瞻方向相反,其语法是(?<=at) home,后顾部分(home)会被标亮,条件(at)不会被标亮

    d. 反后顾: 对正后顾取反,查看某个模式在从左至右的文本流的后面没有出现,其语法是(?<!at) home,匹配到的结果里没有at

    c、d在javascript中不支持

  • 相关阅读:
    java IO流之详细总结
    位运算了解与复习多线程
    java 常见面试题总结(一)
    复习集合框架
    【面试题】java中高以上必会技能
    python-项目流程分析及优化查询方法
    python-day97--django-ModelForm
    python-day97--git协同开发
    python-day96--git版本控制
    python-day91--同源策略与Jsonp
  • 原文地址:https://www.cnblogs.com/huamingao/p/6031411.html
Copyright © 2020-2023  润新知