表达式
你可能熟悉一个计算器解释的表达式。请看下面的算术表达式:
2+4
"2加4" 出几个常数或字面值和一个操作符组成。计算器程序必须能够识别,例如, "2" 是数字常数而加号表示一个操作符,而不能解释为"+"字符。
表达式告诉计算机如何产生结果。尽管我们真正想要的就是"2+4"的结果,但我们不能简单地告诉计算机返回6。我们指示计算机计算表达式并返回值。表达式可以比"2+4"更复杂,事实上,它由多个简单的表达式组成,例如:
2+3*4
计算器通常从左到右计算表达式。然而,某些操作符比其他操作符的优先级高,也就是,它们将被首先执行。因此,上面的表达式的结果为14 而不是20 ,因为乘法的优先级高于加法。将简单的表达式放入圆括号中可以改变优先级,因此"(2+3)*4" 或"2加3的和的4倍"的结果为20。因括号是指示计算器改变表达式计算顺序的符号。
相反,一个正则表达式描述了一种模式或字符序列。字符串连接是每个正则表达式的基本操作。也就是一个模式匹配相邻的一系列字符。请看下面的正则表达式:
ABE
每个字面字符都是一个正则表达式,它只匹配那个单独的字符。这个表达式描述了"B跟着A, E跟着B" 或简单称为"字符串ABE" 。术语"字符串"意味着每个字符都与它前面的字符相连接。不一定要将正则表达式描述为由字符序列组成(初学者倾向于将其考虑成由较高级的单元组成,例如由单词而不是独立的字符组成)。正则表达式区分大小写,因此"A"不匹配"a"。
接受正则表达式的程序(例如grep) 必须首先解析正则表达式的语法来产生一个模式。然后它们一行一行地读取输入未尝试匹配该模式。输入行是一个字符串、而且要看字符串与模式是否匹配,程序将字符串的第一个字符与模式的第一个字符进行比较。如果匹配,就比较第二个字符。无论何时只要匹配失败,就返回并从字符串中这个字符后面的字符重新开始匹配。
正则表达式不只限于文字字符。例如,元字符句点(.)可以作为"通配符"匹配任何单个字符。你可以认为这个通配符与Scrabble 中的空白类似,可以表示任意字母。因此,我们可以指定正则表达式"A.E" 而且它将和"ACE" 、"ABE" 和"ALE" 都匹配。句点与"A"后面的位置上的任何字符匹配。
元字符* (星号)用于与它前面的正则表达式的零个或多个出现匹配,该表达式通常是一个字符。你也许对*作为一个shell元字符更熟习,在那里它表示"零或多个字符"。但是这与它在正则表达式中的含义不同。星号元字符本身不匹配任何字符、它用于修改它前面的内容。正则表达式*匹配任意数目的字符,而在she11中,*本身就具有这种含义(例如,在shell中, ls*表示列出当前目录中的所有的文件)。正则表达式"A.*E"匹配任何与"A.E"匹配的字符串,但是它还匹配在"A"和"E"之间具有任意数目的字符;例如,"A|RPLANE"、"A FINE" 、" AFF ABLE" 或"A LONG WAY HOME"。注意"任意数目的字符"可以是零个字符!
元字符
我们已经看过了表达式中的两个基本元素:
1.以一个字面值或变量表示的值。
2. 一个操作符。
正则表达式是由这些相同的元素组成的。除元字符除外,都被解释为只匹配它本身的字面值。
元字符汇总
特殊字符 | 用途 |
---|---|
. | 匹配除换行符以外的任意单个字符。在awk 中,句点也能匹配换行符。 |
* | 匹配任意一个(包括零个)在它面前的字符(包括由正则表 达式指定的字符) |
[...] | 匹配方括号中的字符类中的任意一个。如果方括号中第一个字符为脱字符号(^),则表示否定匹配,即匹配除了换行符和类中列出的那些字符以外的所有字符。在 awk 中,也匹配换行符。连字符(-)用于表示字符的范圈。如果类中的第一个字符为右方括号(] )则表示它是类的成员。所有其他的元字符在被指定为类中的成员时都会失去它们原来的含义 |
^ | 如果作为正则表达式的第一个字符,则表示匹配行的开始。在awk 中匹配字符串的开始,即使字符串包含嵌入的换行符。 |
$ | 如果作为正则表达式的最后一个字符,则表示匹配行的结尾。在awk中匹配字符串的结尾,即使字符串包含嵌入的换行符。 |
\ {n, m\} | 匹配它前面某个范围内单个字符出现的次数(包括由正则表达式指定的字符)。\ {n\} 将匹配n次出现, \ {n, \}至少匹配n次出现,而且\ {n, m\} 匹配n和m之间的任意次出现。(只有sed 和grep 的一些非常旧的版本中不能使用)。 |
\ | 转义随后的特殊字符。 |
扩展的元字符(egrep和awk)
特殊字符 | 用途 |
---|---|
+ | 匹配前面的正则表达式的一次或多次出现 |
? | 匹配前面的正则表达式的零次或一次出现 |
| | 指定可以匹配其前面的或后面的正则表达式(替代方案) |
() | 对正则表达式分组 |
{n,m} | 匹配它前面某个范圈内单个字符出现的次数(包括由正则表达式指定的字符) 。 { n }表示匹配n次出现, {n,}至少匹配n次出现, { n, m} 匹配n和m之间的任意次出现。(用于POSIX 的egrep 和POSIX awk而不是传统的egrep 或awk) |
元字符在正则表达式中有特殊的含义,与+和*在算术表达式中具有特殊含义的方式相同。有些元字符(+?()|)只有作为由程序(例如egrep和awk)使用的扩展集的一部分时才可用。在一下几节中我们将介绍每个元字符的用法,首先从反斜杠开始介绍。
Linux基础:正则表达式:http://www.linuxdiyf.com/linux/5555.html
Linux中的正则表达式中特殊符号:http://www.linuxdiyf.com/linux/3554.html
Linux Shell系列(3)正则表达式:http://www.linuxdiyf.com/linux/3149.html
grep:基本正则表达式的简单使用:http://www.linuxdiyf.com/linux/3072.html
Vim正则表达式详解:http://www.linuxdiyf.com/linux/1369.html