码迷,mamicode.com
首页 > 其他好文 > 详细

正则表达式基础

时间:2015-08-06 16:40:21      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:

 正则表达式(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

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

 (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\nzo\nzzo‘ | grep ‘z.*o‘   //在zero、nzo、nzzo中匹配以z开头以o结尾的所有字符串  其中的\n为换行

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

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

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

 $ echo ‘1234\nabcd‘ | grep ‘[0-9]‘   //匹配所有的数字

 $ echo ‘1234\nabcd‘ | grep ‘[[:digit:]]‘    //匹配所有的数字

 $ echo ‘1234\nabcd‘ | grep ‘[[:lower:]]‘   //匹配所有的小写字母  

 $ echo ‘1234\nabcd‘ | grep ‘[[:upper:]]‘  //匹配所有的大写字母

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

 $ echo ‘1234\nabcd‘ | grep ‘[[:alpha:]]‘   //匹配所有的字母

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

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

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

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

 $ echo ‘1234\nabcd‘ | 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\nzo\nzoo‘ | grep -E ‘zo{1}‘  //只匹配zo

 $ echo ‘zero\nzo\nzoo‘ | grep -E ‘zo{1,}‘ //匹配以zo开头的所有单词

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

 $ echo ‘www.shiyanlou.com\nwww.baidu.com\nwww.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 ‘21c\www.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 "\n" $2 "\n" $3} else{print} }‘ test  #将test中第一行的每个字段单独显示为一行

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

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

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

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

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

正则表达式基础

标签:

原文地址:http://www.cnblogs.com/forerver-elf/p/4705057.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!