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

     正则表达式(Regular Expression,常简写为regex、regexp或RE):又称正规表达式,正规表示法,正规表达式,规则表达式,常规表示法。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

     基本语法:一个正则表达式通常被称为一个模式(pattern),为用来描述或匹配一系列符合某个句法规则的字符串。

     选择: |     boy|girl  可以匹配boy或girl

     数量限定:*、+、?、.  若在一个模式中不加数量限定符则表示出现一次且仅出现一次

     +表示前面的字符必须出现至少一次或多次  如 goo+gle可以匹配goooogle,gooooooooooogle

     ?表示前面的字符最多出现零次或一次  如 colou?r可以匹配color,colour

     *表示前面的字符可以不出现,也可出现一次或多次  如 0*45可以匹配42,042,0045等

     范围和优先级:()用来定义模式字符串的范围和优先级,可以简单的理解为是否括号内的模式串作为一个整体。如 gr(e|a)y 等价于gray|grey, (grand)?father匹配father和grandfather。

     正则表达式有多种不同的风格,下面列举一些常用的作为PCRE子集的适用用于perl和python变成语言及grep或egrep的正则表达式匹配规则

     PCRE(Perl Compatible Regular Expressions:perl语言兼容正则表达式)是一个用C编写的正则表达式函数库,有Philop Hazel编写。PCRE是一个轻量级的函数库,比Boots值类的正则表达式库要小得多。

       讲一个字符标记为一个特殊字符、或一个原义字符

      ^  匹配输入字符串的开始位置

     $  匹配输入字符串的结束位置

     {n}  n是一个非负整数。匹配确定的n次。 如o{2} 不能匹配bob 但是可以匹配food 

     {n,} n是一个非负整数。至少匹配n次。 如 o{2,}不能匹配bob,但是可以匹配fooood。 o{1,}等价于o+。o{0,}等价于o*

     {n,m}  m和n均为非负整数。其中n<=m。最少匹配n次且最多匹配m次。如 o{1,3}将匹配foooood中的前三个o   o{0,1}等价于o?

     * 匹配前面的表达式0次或多次

     + 匹配前面的表达式1次或多次

     ? 匹配前面的表达式0次或1次

     ? 当?字符紧跟在任何一个其他限制符(*,+,?,{n},{n,m})后面,匹配模式是非贪婪的。非贪婪模式尽可能烧的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。  o+?只匹配单个o  而o+将匹配所有o

     .  匹配除 之外的任何单个字符,若要包含 ,可以使用(.| )

     (pattern)  匹配pattern并获取这一匹配的子字符串。该字符串用于向后引用。要批评圆括号字符,需使用(或)

     x | y 匹配x或y  如 z | food  匹配z或food  (z | f)oo可以匹配zoo或foo

     [xyz]  字符集合(character class)。匹配所包含的任意一个字符。如 [abc]可以匹配plain中的a。其中特殊字符仅有反斜线保持特殊含义,用于转义字符。其他特殊符如星号、加号、各种括号等均作为普通字符。脱字符^若出现在首位则表示负值字符集合;若出现在字符串中仅作为普通字符。连字符-若出现在字符串中表示字符范围描述;若出现在首位则仅作为普通字符。

     [^xyz]  排除型(negate)字符集合。匹配未列出的任意字符。 如 [^abc]可以匹配plain中的plin

     [a-z]  字符范围。匹配指定范围内的任意字符。

     [^a-z]  排除型字符范围。匹配任何不在指定范围内的任意字符。

     优先级:优先级从上到下,从左到右依次降低。

        转义符

     (),(?:),(?=),[]  括号和中括号

     *,+,?,{n},{n,},{n,m}    限定符

     ^,$,任何元字符   定位点和序列

     |   选择

     

      grep模式匹配命令

     grep用于打印输出文本中匹配的模式串,他是用正则表达式作为模拟匹配的条件。grep支持三种正则表达式引擎,分别用三个参数指定: -E:POSIX扩展正则表达式,ERE   -G:POSIX基本正则表达式,BRE  -P:Perl正则表达式,PCRE

     grep常用参数:

     -b  将二进制文件作为文本来进行匹配

     -c  统计以模式匹配的数目

     -i  忽略大小写

     -n  显示匹配文本所在行的行号

     -v  反选,输出不匹配行的内容

     -r  递归匹配查找

     -A n   n为正整数。表示after。除了列出匹配行之外,还列出后面的n行

     -B n   n为正整数。表示before。除了列出匹配行之外,还列出前面的n行

     --color=auto  将输出中的匹配项设置为自动颜色显示  

     $ touch test

     $ vim test  

     //输入一系列字符后 命令行模式下:wq!保存并退出

     $ cat test

     $ grep -c hello test //在test中查找hello所有的行号

     $ grep -i -n c test  //在test中查询c所在的字符串并返回他所在的行数

     $ grep -v shell test //在test中查找除shell外其他的字符串

     $grep hello test //在test中查找hello所在的行的内容

      使用正则表达式

     $ grep 'shiyanlou' /etc/group     //在/etc/group中查找以shiyanlou开头的行 

     $ grep '^shiyanlou' /etc/group   //在/etc/group中查找以shiyanlou开头的行

     $ echo 'zero zo zzo' | grep 'z.*o'   //在zero、nzo、nzzo中匹配以z开头以o结尾的所有字符串  其中的 为换行

     $ echo 'zero zo zzo' | grep 'z.o'   //在zero、nzo、nzzo中匹配以z开头以o结尾,且中间包含一个任意字符串的字符串  其中的 为换行

     $ echo 'zero zo zzo' | grep 'zo*'   //将匹配以z开头,以任意多个o结尾的字符串  其中的 为换行

     $ echo '1234 abcd' | grep '[a-z]'   // gerp默认是区分大小写的,这里匹配所有小写字母

     $ echo '1234 abcd' | grep '[0-9]'   //匹配所有的数字

     $ echo '1234 abcd' | grep '[[:digit:]]'    //匹配所有的数字

     $ echo '1234 abcd' | grep '[[:lower:]]'   //匹配所有的小写字母  

     $ echo '1234 abcd' | grep '[[:upper:]]'  //匹配所有的大写字母

     $ echo '1234 abcd' | grep '[[:alnum:]]'  //匹配所有的字母和数字,包括0-9 a-z A-Z

     $ echo '1234 abcd' | grep '[[:alpha:]]'   //匹配所有的字母

     $ echo '1234 abcd' | grep '[[:blank:]]'   //匹配所有空白键与Tab按键两者

     $ echo '1234 abcd' | grep '[[:cntrl:]]'    //匹配键盘上的控制按键,亦包括CR LF Tab Del等

     $ echo '1234 abcd' | grep '[[:graph:]]'   //匹配除了空白字节外的其他所有按键

     $ echo '1234 abcd' | grep '[[:print:]]'    //匹配任何可以被列出来的字节

     $ echo '1234 abcd' | grep '[[:punct:]]'   //匹配所有标点符号

     $ echo '1234/nabcd' | grep '[[:xdigit:]]'   //匹配所有16进制的数字类型

     之所以要使用特殊符号,是因为上面的[a-z]不是在所有情况下都有效,这还与知己当前的语系有关,即设置在LANG环境变量的值。zh_CN.UTF-8的话,[a-z]即为所有的小写字母,其他语系可能是大小写交替。

     $ echo 'geek|good' | grep '[^o]'  //排除o之外的字符

      使用扩展正则表达式 grep -E 或 egrep

     $ echo 'zero zo zoo' | grep -E 'zo{1}'  //只匹配zo

     $ echo 'zero zo zoo' | grep -E 'zo{1,}' //匹配以zo开头的所有单词

     $ echo 'www.baidu.com www.shiyanlou.com www.google.com' | grep -E 'www.(baidu|shiyanlou).com'   \匹配www.shiyanlou.com和ww.baidu.com

     $ echo 'www.shiyanlou.com www.baidu.com www.google.com' | grep -Ev 'www.baidu.com'  \匹配不包含baidu的内容
      sed流编辑器

     sed工具在man手册里全名为sed-stream editor for filtering and transforming test(用于过滤和转换文本的流编辑器)。sed是一个非交互式的编辑器。sed命令的基本格式 sed [参数]... [执行命令] [输入文件]...

     $ sed -i '1s/sad/happy' test #将test文件中第一行的sad替换为happy 

     sed常用参数 -n  安静模式。只打印受影响行。默认打印输入数据的全部内容   -e 用于在脚本中添加多个执行命令一次执行,在命令行中执行多个命令通常不需要添加该参数   -f filename  指定执行filename文件中的命令   -r  使用扩展正则表达式,默认为标准正则表达式   -i  将直接修改输入文件内容,而不是打印到标准输出设备

     sed编辑器的执行命令的格式为 [n1] [,n2]command  [n1][~step]command n1,n2表示输入内容的行号,他们之间的,表示从n1到n2行,若为~则表示从n1开始以step为步进的所有行。command为执行动作

     $ sed -i 's/sad/happy/g' test  #g表示全局范围

     $ sed -i 's/sad/happy/4' test  #4表示指定行中的第四个匹配字符串

     sed常用参数  s  行内替换  c  正行替换  a  插入到指定行的后面  i  插入到指定行的前面  p  打印指定行 通常与-n参数配合使用   d  删除指定行

     $ cp /etc/passwd ~

     $ nl passwd | sed -n '2,5p'   #打印2-5行

     $ nl passwd | sed -n '1~2p'  #打印奇数行

     $ sed -n 's/shiyanlou/hehe/gp' passwd #将输入文本中shiyanlou全部替换为hehe,并只打印替换那一行

     $ nl passwd | grep 'shiyanlou'

     $ sed -n '21cwww.shiyanlou.com' passwd #删除第21行

      awk文本处理语言

     awk是一种优良的文本处理工具。Linux及Unix环境中现有的功能最强大的数据处理引擎之一。它名字来源于创始人Alfred Aho,Peter Jay Weinberger和Brain wilson Kernighan的三个首字母。三位创建者已将他正式定义为“样式扫描和处理语言”。它允许创建剪短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表等。

     $ ll /usr/bin/awk

     awk所有操作都是基于pattern-action来完成的。如 $ pattern {action} 它将所有的动作操作用一对{}包围起来。其中pattern通常是表示用于匹配输入的文本的关系式或正则表达式,action则是匹配后将执行的动作。在一个完整的awk操作中,这两者只能有一个,若没有pattern则默认匹配输入的全部文本。若没有action,则为打印匹配内容到屏幕。

     awk处理文本的方式,是将文本分割成一些字段,然后在对这些字段进行处理。默认情况下,awk以空格作为一个字段的分隔符。

     awk基本命令格式 awk [F fs] [-v var=value] [-f prog-file | 'program test'] [file...]  其中-F参数用于预先指定前面提到的分段分隔符。-v 用于预先为awk程序指定变量。-f参数用于指定awk命令要执行的程序文件,或在不加-f参数的情况洗直接将程序语句放在这里。最后为awk要处理的文本输入,可以同时输入多个文本文件。

     $ vim test

     $ awk '{print}' test

     $ awk '{if(NR==1){print $1 " " $2 " " $3} else{print} }' test  #将test中第一行的每个字段单独显示为一行

     $ awk '{if(NR==1){OFS=" " print $1, $2, $3}else{print}}' test #将test中第一行的每个字段单独显示为一行

     NR和OFS是awk内建的变量。NR表示当前读入的记录数,即当前的处理行数。OFS表示输出时的字段分隔符,默认为空格。$N中N为相应的字段号。他表示引用相应的字段。$0表示引用当前记录的全部内容。

     $ awk -F'.' '{ if(NR==2){print $1 " " $2 " " $3}}' test  #将test中的字段以点为分隔符换成以空格为分隔符

     $ awk 'BEGIN{FS=".";OFS=" "}{if(NR==2){print $1, $2, $3}}' test  #print打印的非变量内容都需要用""一对引号抱起来

     awk常用的内置变量 FILENAME  当前输入文件名,若有多个文件,则只表示第一个。若输入是来自标准输入,则为空字符串。   $0 当前记录内容  $N  N表示字段号,最大值为NF变量的值   FS  字段分割符,由正则表达式表示,默认为空格   RS 输入记录分隔符,默认为 ,即一行为一个记录   NF  当前记录字段数  NR  已经读入字段数  FNR 当前输入文件的记录数  OFS  输出字段分隔符,默认为空格  ORS 输出记录分割符,默认为

  • 相关阅读:
    Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate)
    跨平台将终结
    一万字详解 Redis Cluster Gossip 协议
    Java实现简单的计算器
    CSDN开发者周刊第 22期:谷歌 DeepMind 第四代:不学规则就可以玩游戏;图灵奖得主 Edmund Clarke 因感染“新冠”逝世;
    理解Python闭包,这应该是最好的例子
    sscanf函数用法详解
    web项目中配置多个数据源
    web项目中配置多个数据源
    动态表格之查看、删除、编辑
  • 原文地址:https://www.cnblogs.com/forerver-elf/p/4705057.html
Copyright © 2011-2022 走看看