zoukankan      html  css  js  c++  java
  • shell编程之正则表达式

    1、正则表达式

      其实就是一种规范,也就是模式,约束字符串等符合什么样的格式,比如要求字符串必须a开头,t结尾,符合这样条件的字符串就要用到正则表达式。

    2、两套库

      GNU/Linux中有有两套库用足正则表达式编程,POSIX库,自带的;PCRE库,Perl,功能比较全,本文采用Perl。

    3、初体验

      $egrep ""^a.*t$" /usr/share/dict/words  表示从words文件中查找以a开头,t结尾的单词。

      $egrep ""^a.*t$" /usr/share/dict/words | wc -c  统计得到单词的数量。

    4、字符集和单词

      “.”用于匹配除了换行符之外的任意一个字符,.at就能匹配cat、#at、&at……

      [a-z]at:限定只能是小写字母

      [abc]at:只能是a或者b或者c

      [a-zA-Z]at.匹配所有的英文字母,[0-9]匹配0到9的数字。

      说明:"[a-z]at":只要含有[a-z]at都匹配,例如cat、a#$bat@!bat$@$等,要想只限制cat这样的,要加单词约束/<[a-z]at/>.

      Linux中,“单词”是指两侧由非单词字符分割的字符串。

      非单词字符是指除了字母、数字、下划线以外的任何字符。

    5、字符类的概念

      $egrep "[[:upper:]]t$" words,匹配大写字母开头,小写字母t结尾的字符换。诸如[[:uper:]]又很多,小写字母等等。

    6、位置匹配

      “^”行首、“$”行尾

      例:^a[a-z]t$:以字母a开头。t结尾,中间包含一个小写字母的单词。

    7、字符转义

      这个和C、C++等语言中的转义字符概念一致,就是比如你想输进去“.”,可是“.”表示除换行符外的任何字符,那么可以使用“.”就表示其本身了。

    8、重复

    “*”表示任意数量的重复

    “+”表示重复至少1次

    “?”表示重复0或1次

    “{3}”表示重复3次,“{n,m}”表示重复至少n次,至多m次;“{n,}”表示重复至少n次,没上限。

    9、子表达式

    也称为“分组”,说的更直白一点就是,一坨字符串看成一个整体,用括号括起来(),整体出现。

    例:“(my){2}&t”就表示以t结尾,my出现两次的字符串。这时候my是一个整体。mymyt等将被匹配。

    10、反义

    就是取原来的匹配相反的匹配。整体取反。

    [^y]:除了y字符都能匹配。[6aoeiu]:除了aooeiu所有的字符。

    注意:^[^y]表示行首不为y,^在表示行首和反义时在位置上的区别。

    11、分支

    ^ht$:行首为h,行尾为t,表示并且。

    ^h|t$:行首为h,或者行尾为t,表示或。

    例子:Jan(uary| |.):匹配January或January或者Jan.

    12、逆向引用

    子表达式(分组)中捕获的内容可以在正则表达式的其他地方再次使用,用户可用反斜杠“”加自表达式上标号来指代该分组匹配到的内容。

    (<.*>).?()*1:其中1前面的(<.*>),表示匹配任意长度档次的第一个表达式

    从左到右第一个出现的自表达式为1、第二个为2……

    ……

    当然,正则表达式的匹配是门大学问,通常我们只能写出简单的,具体的应用还要自己写出一些更为复杂的正则表达式,并且正则表达式的编写极为容易出错,主要是考虑不全。

    大家也可以参考如下这篇文章,写的很赞,很适合入门,简单应用:正则表达式30分钟入门教程

  • 相关阅读:
    HDU6397
    容斥原理推导错排通项公式
    重复排列的证明
    圆排列证明
    rock-paper-scissors
    The more, The Better
    趁着情人节写点东西
    分层图最短路问题
    背包问题是否装满问题
    Python面向对象编程扑克牌发牌程序,另含大量Python代码!
  • 原文地址:https://www.cnblogs.com/xiangyangzhu/p/regex.html
Copyright © 2011-2022 走看看