zoukankan      html  css  js  c++  java
  • 通用正则表达式

    区别于常见的正则表达式教程,本教程让你快速入门,并规避常见问题。

    (大家可以阅读完后边的教程再阅读注意事项,注意事项放在前边只是为了引起注意)

    在开始之前先说一些值得大家注意的事项吧

    1 正则表达式没有逻辑与、逻辑非关系。那么要实现逻辑与,就要靠表达式序列来实现了,也就是组合。而逻辑非要靠零宽断言来实现了,但是不幸的是,现在大多数工具对断言啊,分组捕获啊,的支持并不完整。比如sed,是不支持断言的。

    2 正则表达式的逻辑或关系,在正则表达式中是靠多选来实现的。

    3 请谨遵语法,对于那些用惯了一个*来代表若干字符的,请注意,这并不是标准的正则表达式,而是一些工具自己内部封装的特殊符号。

    4 注意匹配的范围,正则表达式默认是匹配最大范围,就是说大家要考虑匹配句子?匹配单词?匹配单词的一部分?比如有以下的文本行,int main(int argc... ,对于表达式.*t将匹配以下内容 int main(int,而如果你用w*t,将只匹配2个int,更严谨的表达方式是w*t。所以建议大家尽可能使用代表小范围的通配符(元字符)。

    5 至于贪婪和懒惰啊,递归啊,这些在某些语言中有支持,但是这个因为语言差异太大,本文不作详述。

    一些符号注意事项

    1 - 连字符,这个只在字符组内有特殊意义,在字符组外代表字符本身。

    2 ^ 脱字符,在字符组内的最前位置时表示排除的意思,在字符组内的其它位置表示字符本身,在字符组外则是通配符,表示行首。

    3 . $ * + ? { } ( ) | ,在字符组内表示字符本身,在字符组外则是通配符或作用符。

    4 字符组内,[ 和 ] 需要转义

    5 分组内,( 和 ) 需要转义

    正则表达式是记录文本规则的代码,主要的作用就是用于匹配文本。

    语法:[内容][次数]

    1 我们把一个内容和次数组成的块叫小节,那正则表达式就是由若干个小节构成的。

    2 内容后如果不加次数代表内容出现一次。

    3 特定内容(位置元字符)后不应该跟次数。比如 ^ 和 $ 。

    内容可以是普通字符、元字符、逻辑表达式和引用。

    元字符表

        .     匹配除换行符以外的任意字符
        w    匹配字母或数字或下划线或汉字
        s    匹配任意的空白符
        d    匹配数字
            匹配单词的开始或结束
        ^     匹配字符串的开始
        $     匹配字符串的结束
        W    匹配任意不是字母,数字,下划线,汉字的字符
        S    匹配任意不是空白符的字符
        D    匹配任意非数字的字符
        B    匹配不是单词开头或结束的位置
    

    注意:其中、^、$、B不代表任何字符位,他们代表一个位置,我们称他们为位置元字符,其它元字符称为占位元字符。

    次数表

        *        重复零次或更多次
        +        重复一次或更多次
        ?        重复零次或一次
        {n}      重复n次
        {n,}     复n次或更多次
        {n,m}    重复n到m次
    

    例:

        d{5}     可以匹配 99999
        w*ing    可以匹配 doing
        w+ing    可以匹配 doing
        w{2}ing  也可以匹配 doing
    

    逻辑表达式

    我们把逻辑表达式划分为组合、字符组、分组、多选。

    组合

    像 w*ing 是由4个小节构成的,分别是w*、i、n、g。

    字符组

    []中括号扩起来的若干字符表示一个字符组,字符组内的字符是"或"的关系。

    字符组内可使用连字符-。

    注意:字符组后边的次数,一般用 + 而不用 *,因为字符组后用 * 会匹配到出现0次的情况,这种情况会匹配到  。

    比如你想用字符组匹配2个单词 int 或 argc,[(int)(argc)] 是错误的,这个代表2个分组,而分组内又是组合。集合内不能识别分组,将小括号识别为普通字符。

    看来结果将不符合你的预期,这种逻辑建议使用或来表述 int|argc。

    例:

        [int]      分别匹配字符i、n、t
        [0-9]      分别匹配0到9
        [int]+ 可以匹配到单词int、in、it
    

    排除字符组

    ^ 表示排除

    注意:如果你想在字符组内使用排除法去匹配一个单词(见下面的例子),建议你在集合内加上 W (大写),否则空格和一些特殊字符也会被匹配到。

    例:

        [^x]          匹配除了x以外的任意字符。
        [^aeiou]      匹配除了aeiou这几个字母以外的任意字符
        [^intW]  匹配不出现字符i、n、t的单词,如果不加 W ,空格和一些特殊字符就不被排除
    

    分组

    ()用小括号括起来的子表达式

    例:

        (d{1,3}.){3} 匹配999.999.999.
    

    多选

    | 表示"或"

    注意:或的优先级低于其它任何逻辑表达式。可使用分组来提高或的优先级。

    例:

        int|argc     除了可以匹配到 int 或 argc,还可以匹配到 inta 或 hargc内的部分字符
        (int|argc)   只匹配单词 int 或 argc
    

    转义字符

    使用斜杠来显现转义字符。

    所有的元字符、次数符、逻辑符号都需要转义。

    需转义的字符有

         . ^ $ * + ? { } [ ] ( ) |
    

    后向引用

    引用允许在后边的表达式中引用前边捕获到的分组的文本。

    分组被捕获,然后用斜杠加数字引用捕获到的内容。

    命名捕获在不同的语言中有不同的表示方法(Paython中使用(?P<name>group),.NET framework 中使用(?<name>group)),在这里不详述。

    例:

        (w+)s+1  捕获像 go go, 或者kitty kitty 这样的叠词
    

    零宽断言

    断言是一种判断,就是判断是否符合断言表达式,符合时才匹配其它内容,不符合就不匹配。

    注意:断言的内容不被匹配,这也是为什么它们被称为零宽的原因。

    零宽断言不能单独存在,必须与非零宽的表达式组合。

    不是所有的工具都支持所有的零宽断言。

    断言表达式

        (?=exp)       匹配exp前面的位置
        (?<=exp)      匹配exp后面的位置
        (?!exp)       匹配后面跟的不是exp的位置
        (?<!exp)      匹配前面不是exp的位置
    

    断言分为正向断言和负向断言,上表前2个表达式是正向断言,后2个表达式是负向断言。

    例:

        w+(?=ing)    匹配以ing结尾的单词
        (?<=re)w+    匹配以re开头的单词
        ((?!abc)w)+  匹配不包含连续字符串abc的单词
        (?<![a-z])d{7}   匹配前面不是小写字母的七位数字
    
  • 相关阅读:
    Django(69)最好用的过滤器插件Django-filter
    Django(68)drf分页器的使用
    Django(67)drf搜索过滤和排序过滤
    SweetAlert使用
    虚拟环境之间批量pip安装包迁移
    ubuntu 18.04 安装uwsgi 和nginx
    ubuntu 18.04安装mysql及常见问题处理
    ubuntu 18.04安装virtualenv和virtualenvwrapper安装及使用
    滚动视差stellar.js
    JMeter之使用技巧
  • 原文地址:https://www.cnblogs.com/the-capricornus/p/5643210.html
Copyright © 2011-2022 走看看