正则表达式 学习笔记

正则表达式
前言:ed vim emacs grep gawk sed等工具使用的正则表达式,这些表达式与shell的模糊文件引用中使用的正则表达式是不同的

A1 字符
   字符是除换行之外的其他任意字字符。正则表达式中的大多数字符代表它们自身,而那些不代表自身的字符称为特殊字符。如果需要特殊字符代表自身,那么就需要将这些字符转义。

A2 定界符
  正则表达式使用 / 作为定界符,vim中允许使用其它定界符,而grep不使用任何定界符。在一些含义不模糊的情况下,第2个定界符不是必要的。例如,当第2个定界符后面要紧跟RETURN时,就可以省略第2 个定界符

A3 简单字符串
最基本的正则表达式是只包含非特殊字符和定界符的简单字符串。简单字符串只与它自身匹配
正则表达式  匹配字符串  示例
/ring/  ring  
/Thursday/  Thursday  
/or not/  or not  

A4 特殊字符
  正则表达式中使用特殊字符可以使得正则表达式匹配多个字符串

  A4.1 句点
  /.alk/ 句点匹配任意单个字符,该字符不能为空

  A4.2 方括号
  /[bB]ill/  与bill和Bill匹配
  /t[aeiou].k/  与t后跟元音字母匹配
  /# [6-9]/  与#后跟空格再跟6到9之间的数字的字符串匹配
  /[^a-zA-Z]/ 与26个字母之外的任意字符匹配

  A4.3 星号
  * 跟随在代表某个字符的正则表达式之后,表示与该正则表达式所匹配的 0个或多个匹配,跟在句点后的星号可以匹配任意字符串,字符定义类后跟星号可以匹配包含该类定义的成员字符的任意字符串
  /ab*c/  a后跟0个或多个b后再跟c的字符串匹配
  /ab.*c/ 与ab后跟0个或多个字符再跟c的字符串匹配
  /t.*ing/ 与t后跟0个或多个字任再跟ing的字符串匹配
  /[a-zA-Z]*/ 与由字母和空格组成的字符串匹配
  /(.*)/ 与圆括号括起来的最长字符串匹配
  /([^)]*)/ 与圆括号括起来的最短字符串匹配
  A4.4   脱字符与美元符号
    以脱字符开始的正则表达式只能匹配位于行首的字符串,以美元符号结尾的正则表    达式只能匹配行末尾的字符串
    /^T/  与位于行首的T匹配
    /^+[0-9]/ 与位于行且由加号后跟一个数字组成的字符串匹配
    /:$/ 与位于行尾的:匹配

  A4.5 转义特殊字符
    在特殊字符之前使用反斜杠可以转义除数字和圆括号外的特殊字符。
    /end./  与end后跟一个句点的字符串匹配
    /\/  与单独一个反斜杠匹配
    /*/ 与单独一个星号匹配
    /[5]/  与 [5]匹配
    /and/or/  与and/or匹配

A5 规则
  A5.1 最长匹配
    正则表达式总是与尽可能长的字符串匹配,从行的开始尽可能地向前匹配
    例如:This (rug) is not what it once was (a long time ago),is it?
    表达式/Th.*is/将匹配
    This (rug) is not what it once was (a long time ago),is
    表达式/(.*)/将匹配
    (rug) is not what it once was (a long time ago)
    表达式/([^)]*)/将匹配
    (rug)
  
  A5.2 空正则表达式
    对于某此工具例如vim 和less,但对于grep不适用,空正则表达式代表上次使用的表达式。例如在vim 中使用下面的替换命令
    :/s/mike/robert
    如要再次使用该替换可以使用下面的
    :s//robert/
    或者
    先查找mike串,再进行替换
    /mike/
    :s//robert/
    其中的空正则表达式(//)代表上次使用的正则表达式(/mike/)

A6 括号表达式
  使用转义圆括号可以将下则表达式括起来。但并不会改变匹配效果例如下例
  /a(b*)c/与/ab*c/是一样的

A7 替换字符串
  A7.1 &符号
    在替换字符串中&代表搜索字符串所匹配的字符串的值,例
    在文件 123 123 456 567使用:s/[0-9][0-9]*/(&)
    结果是(123) (123) (456) (567)

  A7.2 转义数字
    last-name, first-name initial
    转成first-name initial last-name

    :1,$s/([^,]*), (.*)/2 1/

A8 扩展的正则表达式
  工具egrep,带-E的工具grep,和gawk
  我没找到用的地方,先不细写了,用到了再加上
  redhat vi,grep都用不了

A9 小结
正则表达式中的特殊字符
.  与单个字符匹配
*  与*前边一个字符的0个或多个匹配
^  与行的开始匹配,在[]中表示不包括在类中
$  与行的末尾匹配
  用来转义的
<  与字的开始匹配
>  与字的末尾匹配

扩展正则

替换字符串
&  代表匹配的字符串
n  转义n代表第n个被括号正则表达式所匹配的字符串

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注