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

    在文件命令中经常会使用pattern正则表达式,它是可以描述一类字符串的模式(pattern),如果一个字符串可以用某个正则表达式来描述,就称这个字符和该正则表达式匹配。这和dos中用户可以使用通配符“*”代表任意字符类似。在linux系统上,正则表达式通常被用来查找文本的模式,以及对文本执行“搜索-替换”操作等。

    虽然正则表达式多年来在工具与UNIX版本上不断在变化,但POSIX标准仅提供两种正则表达式。你可以利用标准的库程序进行模式匹配的工作。这样就可以编写出专用的工具程序,用于与grep一致的正则表达式(POSIX称之为基本型正则表达式,Basic Regular Expressions,BRE),或是用于与egrep一致的正则表达式(POSIX称之为扩展型正则表达式,Extended Regular Expressions,ERE)。

    1. 特殊字符

    BRE和ERE都支持的字符:

    :忽略正则表达式中特殊字符的原有含义,有时则是相反地打开后续字符的特殊含义。

    .:匹配任何单个字符,但NUL除外。==>匹配字符

        如tol.toy表示一行中,含有tol这3个字母,加上任何一个字符,再接着toy这3个字母。

    *:匹配在它之前的任何数目(或没有)的单个字符,即“匹配0个或多个前面的单个字符”。以ERE而言,此前置字符可以是正则表达式,例如:因为.表示任一字符,所以".*"代表“匹配任一字符的任意长度”。

         以BRE来说,*若置于正则表达式的第一个字符,不具有任何意义。  ==>匹配数目

     如tol.*toy表示一行中含有tol这3个字母,加上任意的0或多个字符,再继续toy这3个字母(例如toltoy,tolstory,tolWHOtoy)。

    ^:匹配正则表达式的行首或字符串起始,BRE:仅在正则表达式的开头处具有特殊含义,ERE:置于正则表达式的任何位置都具有特殊含义。如BRE下ab^cd中^表示的就是本身。

    $:匹配正则表达式的行尾或字符串尾,BRE:仅在正则表达式的结尾处具有特殊含义,ERE:置于正则表达式的任何位置都具有特殊含义。如BRE下ab$cd中$表示的就是本身。

      ^$用来匹配空的字符串或行列。

    []:方括号表达式(bracket expression),匹配方括号内的任一字符

      [-]:连续字符的范围,如[A-Z],即A、B、C一直到Z都符合要求;^符号置于方括号里第一个字符则有反向含义,匹配不在方括号内的任意一个字符。

    仅BRE支持的的meta字符(特殊字符):

    {n,m}: 区间表达式,匹配在它前面的单个字符重现的次数区间。{n}指的是重现n次;{n,}则为至少重现n次,而{n,m}为重现n至m次。n与m的值必须介于0至RE_DUP_MAX(含)之间,后者最小为255。

    ( ): 反向引用。将(与)间的模式存储在特殊的“保留空间(holding space)”。最多可以将9个独立的子模式(subpattern)存储在单个模式中。匹配于子模式的文本,可以通过转义序列(escape sequences)1至9被重复使用在相同模式中。例如(ab).*1,指的是匹配于ab组合的两次重现,中间可存在任何数据的字符。(ab)(cd)[def]*21匹配abcdcdab, abcdeeecdab, abcddddeeefffcdab,...

      反向引用在寻找重复字符及匹配引号时特别好用,(["']).*1匹配以单引号或双引号括起来的字,如‘foo'或“bar”。

    : 重复在(与)括号内第n个子模式至此处的模式。n为1至9的数字,1为由左开始。

    仅ERE支持的meta字符:

    {n,m}: 同上面BRE的{n,m},只是括号内没有反斜杠。

    +:匹配前面正则表达式的一个或多个实例。

    ?:匹配前面正则表达式的零个或一个实例。

    |:匹配于|符号前或后的正则表达式。  交替,优先级最低。

    ():匹配于方括号括起来的正则表达式群。分组

      ^abcd|efgh$匹配字符串的起始处是否有abcd或者字符串结尾处是否有efgh

      ^(abcd|efgh)$找一个正是abcd或正是efgh的字符串

    2. Posix方括号表达式

    为配合非英语的环境,POSIX标准强化其字符集范围的能力。

    方括号表达式除了字面上的字符外,还支持字符集(character class),排序符号(collating symbol),等价字符集(equivalence class)。

    排序(collating)是指给予成组的项目排列顺序的操作。一个posix的排序元素由当前locale中的元素名称组成,并由[.与.]括起来。

    等价字符集则用来让不同字符在匹配时视为相同字符。等价字符集将类别(class)名称以[=与=]括起来。

    Posix字符集以[:与:]将关键字组合起来,表示字符的类别。

    [:alunm:]   数字字符

    [:alpha:]  字母字符

    [:blank:]  空格(space)与定位(tab)字符

    [:cntrl:]  控制字符

    [:digit:]  数字字符

    [:graph:] 非空格(nonspace)字符

    [:lower:] 小写字母字符

    [:print:]   可显示字符

    [:punct:] 标点符号字符

    [:space:] 空白字符(whitespace)

    [:upper:] 大写字母字符

    [:xdigit:]  十六进制数字

    注:排序元素、等价字符集以及字符集,都仅在方括号表达式的方括号内认可。也就是说,像[:alpha:]这样的正则表达式,匹配字符a、l、p、h以及:,表示所有英文字母的正确写法应为[[:alpha:]]。

    在方括号表达式中,所有其他的meta字符都失去其特殊含义。所以[*.]匹配字面上的星号、反斜杠以及句号。

    要让]进入该集合,可以将它放在列表的最前面[]*.]。

    要让-进入该集合,可以将它放在列表的最前面[-*.]。

    要让]和-进入该集合,]放到第一位,-放到最后一位,可以将它放在列表的最前面[]*.-]。

    posix明确指出:NUL字符不需要是可匹配的。此外个别工具程序不允许使用.或[]来进行换行字符匹配。

     3. BRE运算符优先级

    4. ERE运算符优先级

    5. 正则表达式的扩展

    通用扩展

    注:单词是由字母、数字及下划线组成。

    参考:

    http://www.cnblogs.com/jiqing9006/category/405401.html

    http://deerchao.net/tutorials/regex/regex.htm

    《shell脚本学习指南》

    5分钟搞懂正则表达式

  • 相关阅读:
    模块化工具require 学习笔记
    学习Jade模板引擎
    通过border来实现各种三角符号
    使用vscode 编译 sass
    Javascript 运行机制
    Vue调试工具 vue-devtools
    MVVM框架
    通信类
    面向对象
    原型和原型链
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/6194136.html
Copyright © 2011-2022 走看看