正则表达式
正则表达式是一种表示法,只要工具支持这种表示法,那么该工具就可以用正则表达式处理字符,它是一类字符所书写的模式,其中许多字符不表示其字面意思,而是表达控制或通配等功能,正则表达式的这种搜索能力是程序实现的。
元字符:不表示其字面意思,而用于额外功能性描述
正则表达式需要一个专门的处理程序(正则表达式处理程序)。这种机制可称作正则表达式引擎。
正则表达式的字符串表示方式依照不同的严谨度可分为:
基本正则表达式:支持的元字符少一点,功能少一点
扩展正则表达式:支持的元字符多一点,功能多一点
支持正则表达式的几个常用工具:
grep,egrep
grep:
Globalsearch REgular expression and Printout the line.
grep是一个文本搜索工具,它能使用正则表达式搜素文本,grep命令在linux中是很有用的,它可以和管道(|)配合起来使用,很强大,可用于逐行搜索文本文件.如想要在几个文本文件中查找一串字符串。‘grep’在文本中搜索并显示与你指定所能匹配的字符串所在行默认情况下,grep只搜索当前目录,当然要搜索次目录下的子目录,可通过选项-d(递归)来显示。
基本正则表达式的元字符:
字符匹配:
.:匹配任意单个字符
比如,我们要找出/etc/passwd/下的所有以i开头b结尾,且中间跟了任意2个字符的字符
[]:匹配指定范围内的任意单个字符
[0-9]或[[:digit:]] :任意数字
[a-z]或[[:lower:]] :任意小写字母
[A-Z]或[[:upper:]] :任意大写字母
[[:space:]] :空白字符
[[:punct:]] :特殊字符(标点符号)
[[:alpha:]] :所有的大小写字母
[[:alnum:]] :所用的数字和字面
[^]:取反
次数匹配元字符:用于实现指定其前面的字符所能够出现的次数
*:任意长度,意思是*前面的字符可以出现任意次,包括0次
\?:0次或1次,它前面的字符是可有可无的
\{m\}:表示精确匹配次数,它前面的字符要出现m次
\{m,n\}:范围表达方式.至少m次,至多n次.当然m要小于n.
\{m,\}:至少m次
\{0,n\}:至多n次
.*: 匹配任意长度的任意字符
例如
这是因为正则表达式默认情况下工作于贪婪模式。尽最大能力去匹配,能匹配多长就匹配多长。
位置锚定:
^:行首锚定:
写在模式最左侧
$:行尾锚定:
写在模式最右侧
^$:表示空白行
\<:词首锚定,出现于单词左侧
\<char
\>:词尾锚定,出现于单词右侧
char\>
\b:表示出现在词首或词尾都 可以
分组:
分组的目的是为了实现将不止一个字符当做一个不可分割的原子单位来对待的。
分组中的模式匹配到的内容,可由正则表达式引擎记忆在内存中,后可被多次引用。只要形如(\)\的括号出现,不论引用与否,都已经被记录下来
\(\)
例如:\(ab\)*:表示ab这个组可以出现任意次数
这里的括号有特殊意义,所以要加\来转义
这表示ro最少出现一次
引用:
例如:
\(ab\(x\)c\)\.*\(mn\) :表示在abc这个组\(abc\)中有个x \(x\),然后中间紧跟着任意长度的任意字符串.*。后面还有个mn组 \(mn\)
这里的括号有编号:自左向后的左括号,以及与其匹配的右括号
\#:引用第n个括号所匹配到的内容,而不是模式本身
例如:
\(ab\?c\).*\1 这里的 \1可以看着是一个变量名,每次输入一串字符后都会保持下来,而且新的字符会把原来保存的覆盖掉
命令选项:
-v:反向选取
-o:仅显示匹配的字串,而非字串所在的行
-i:ignore-case,忽略字符大小写
-E:支持使用扩展正则表达式
例:显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
找出netstat -tan命令执行结果中以'LISTEN'结尾的行;
这里我们用管道把netstat –tan的结果送给grep
扩展正则表达式:egrep;grep-E也支持扩展正则表达式,此时相当于egrep.
字符匹配:
.
[]
[^]
次数匹配:
*:任意次
?:0次或1次
+:至少1次;
{m}:精确匹配m次
{m,n}:至少m次,至多n次
{m,}:最少m次
例如:显示/proc/meminfo文件中以大写或小写S开头的行;用egrep来实现