Linux正则表达式-表达式


你可能熟悉一个计算器解释的表达式。请看下面的算术表达式:
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"。注意"任意数目的字符"可以是零个字符!

相关内容