zoukankan      html  css  js  c++  java
  • 17 正则表达式(重点)

    正则表达式是一种符号表示法,被用来识别文本模式。在某种程度上,它们与匹配文件和路径名的shell通配符比较相似,但其规模更庞大。

    一、grep程序——在文本文件中查找一个指定的正则表达式,并把匹配行输出到标准输出

    -i 忽略大小写
    -v 不匹配
    -c 打印匹配数量而不是文本本身
    -l 打印包含匹配项的文件名
    -L 相似-l,但只打印不包含匹配项的文件名
    -n 在每个匹配行之前打印出其位于文件中的相应行号
    -h 对应于多文件搜索,不输出文件名

     二、正则表达式的元字符

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

    (1) .圆点字符,用来匹配任意字符

                   如果我们在正则表达式中包含它,它将会匹配在此位置的任意一个字符。  

    huiubantu@ubuntu:~$ grep -h '.zip' dirlist*.txt   会输出类似binzip2   bzip2 gzip

    (2)^插入符号和$美元符号会被看做是锚(定位点)

                  这意味着正则表达式只有在文本行的开头或末尾被找到时,才算发生一次匹配。

    huiubantu@ubuntu:~$ grep -h '^zip' dirlist*.txt      会输出类似zip zipcloak zipgrep zipinfo,就是说前边被占有,不能匹配
    huiubantu@ubuntu:~$ grep -h 'zip$' dirlist*.txt      会输出类似bzip binzip lockzip,就是说后边已被占有,不能匹配上字符

    (3)中括号表达式和字符类

        通过使用中括号[],我们能够从一个指定的字符集合中匹配一个单个的字符

    huiubantu@ubuntu:~$ grep -h '[bg]zip' dirlist*.txt   会输出bzip bzip2recover gzip2 

        如果在正则表示式中的第一个字符(否则不生效)是一个插入字符,则剩余的字符被看作是不会在给定的字符位置出现的字符集合。

    huiubantu@ubuntu:~$ grep -h '[^bg]zip' dirlist*.txt  会输出bunzip2 funzip

    (4)传统的字符区域,用-简写

    如,在我们的列表中找到每个以大写字母开头的文件,以下边这种方式写比较麻烦

    huiubantu@ubuntu:~$ grep -h '^[ABCDEFGHIJKLMNOPQRSTUVWXYZ]' dirlist*.txt   

          我们可以用一个三字符区域来缩写26个字母,如下

    huiubantu@ubuntu:~$ grep -h '^[A-Z]' dirlist*.txt

    另外,比较以下两种写法:

    huiubantu@ubuntu:~$ grep -h '[A-Z]' dirlist*.txt   输出包含一个大写字母的文件名
    huiubantu@ubuntu:~$ grep -h '[-AZ]' dirlist*.txt   输出表达式中包含一个连字符或者大写字母A或者大写字母Z的文件名

     三、POSIX字符集

       UNIX刚开发时,使用ASCII字符,ASCII字符中,前32个字符(数字0-31)是控制码(例如tabs,backspaces,和回车),再有32个字符(32-63)包含打印字符,包含大多数的标点符号和数字0到9;再随后的32个字符(64-95)包含大写字符和一些更多的标点符号。最后的31个字符(96-127)包含小写字母和更过的标点符号。

    系统使用这种排序规则的ASCII:  ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

                      正常的字典顺序: aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ

    POSIX标准介绍了locale,可以被调整来为某个特殊的区域,选择所需的字符集。

    1.POSIX相融的应用程序将会使用字典排列顺序而不是ASCII顺序

    huiubantu@ubuntu:~$ echo $LANG
    en_US.UTF-8

    2.将字典顺序恢复为ASCII顺序

                          改变LANG的值,将其设置为POSIX

    3.POSIX字符集

    [:alnum:] 字母数字字符,在ASCII中,等价与:[A-Za-z0-9]
    [:word:] 通上,增加了下划线字符
    [:alpha:] 字母字符,在ASCII中,等驾驭:[A-Za-z]
    [:blank:] 包含空格和 tab 字符。
       
       
       
       
       
       

    四、POSIX基本的Vs.扩展的正则表达式

        POSIX分类:基本正则表达式(BRE)和扩展正则表达式(ERE)

              BRE的元字符      ^ $ . [] *    其他被认为是文本文件

              ERE的元字符      ^ $ . [] *  () {} ? + |

             在 BRE 中,字符 (, ), {,和 } 用反斜杠转义后,被看作是元字符, 相反在 ERE 中,在任意元字符之前加上反斜杠会导致其被看作是一个文本字符。

      1.alternation(交替)

    huiubantu@ubuntu:~$ echo "AAA" | grep AAA
    AAA
    huiubantu@ubuntu:~$ echo "BBB" | grep AAA

         使用交替

    huiubantu@ubuntu:~$ echo "AAA" | grep -E 'AAA|BBB'  这个正则表达式用单引号引起来,为的是阻止 shell 把竖杠线元字符解释为一个 pipe 操作符
    AAA
    huiubantu@ubuntu:~$ echo "BBB" | grep -E 'AAA|BBB'
    BBB
    huiubantu@ubuntu:~$ echo "CCC" | grep -E 'AAA|BBB'

    2.()来分离alternation

    huiubantu@ubuntu:~$ grep -Eh '^(bz|gz|zip)' dirlist*.txt
    huiubantu@ubuntu:~$ grep -Eh '^bz|gz|zip' dirlist*.txt

    3.?限定符——匹配一个元素零次或一次

    huiubantu@ubuntu:~$ "(555) 123-4567" | grep -E '^(?[0-9][0-9][0-9])? [0-9][0-9]$'
    (555) 123-4567: command not found
    huiubantu@ubuntu:~$ "(555) 123-4567" | grep -E '^(?[0-9][0-9][0-9])? [0-9][0-9][0-9][0-9][0-9]$'
    (555) 123-4567: command not found

    4.+限定符——匹配一个元素一次或多次

    5.{}限定符——匹配一个元素特定的次数

  • 相关阅读:
    负数之美
    css重设
    编码问题
    wed的各种前端打印方法(3)CSS
    表单
    学习前端心得
    去除input,a,按键链接时出现的虚线方法
    加载事件js代码
    深入C#数据类型
    查找
  • 原文地址:https://www.cnblogs.com/xiaoxiaohui2015/p/5792603.html
Copyright © 2011-2022 走看看