基本结构块是匹配单个字符的正则表达式。大多数字符,包括字母和数字,都能自己匹配自己,例如给定正则表达式"a",它能匹配字母a。所有的元字符都具有特殊意义,需要使用反斜线进行转义。
正则表达式可以使用下面几种方式来表示重复次数。
'.'
点"."可以匹配任意单个字符。
'?'
可以匹配前一个条目0或一次。例如,"ca?b"可以匹配"cb"也可以匹配到"cab",但不能匹配到"caab"。如果使用了分组,如"c(ca)?b"能匹配"cb"或"ccab"。
'*'
匹配前一个条目0或任意多次。
'+'
匹配前面的条目一次或多次。
'{N}'
匹配前面的条目正好N次。
'{N,}'
匹配前面的条目N次或更多次。即至少匹配N次。
'{,M}'
匹配前面的条目最多M次。即匹配0到M次。
'{N,M}'
匹配前面的条目N到M次。
两个正则表达式可以进行串联,串联后的匹配结果是这两个正则表达式的匹配结果进行的串联。例如正则表达式"ab"就是"a"和"b"串联后的正则。
两个正则表达式还可以使用竖线符号"|"进行连接,这表示二者选一,只要能匹配竖线两边任意一个正在表达式均可,若能同时匹配上也可。例如字符串"acx"、"bx"、"accb"均能被正则表达式"ac|b"匹配上,其中"accb"被同时匹配上。
重复次数的符号优先级高于串联高于二者选一符号"|",使用括号可以改变优先级规则。
3.2 Character Classes and Bracket Expressions(字符类和中括号表达式)中括号正则表达式是使用"["和"]"包围的字符列表。它能匹配该列表中的任意单个字符。如果列表中的第一个字符是"^",则表示不匹配该列表中的任意单个字符。例如,'[0123456789]'能匹配任意数字。
中括号中可以使用连字符"-"连接两个字符表示"范围"。例如,C字符集下的"[a-d]"等价于"[abcd]"。大多数字符集规则和字典排序规则一样,这意味着"[a-d]"不等价于"[abcd]",而是等价于"[aBbCcDd]"。可以设置环境变量"LC_ALL"的值为C使得采取C字符集的排序规则。
最后,预定义了几个特定名称的字符类,它们都使用中括号包围。如下:
'[:alnum:]'
匹配大小写字母和数字。等价于字符类'[:alpha:]'与字符类'[:digit:]'的和。
'[:alpha:]'
字母字符类。匹配大小写字母。等价于字符类'[:lower:]'和字符类'[:upper:]'的和。
'[:blank:]'
空白字符类。包括:空格和制表符。
'[:cntrl:]'
控制字符类。在ASCII中,这些字符的八进制代码从000到037,还包括177(DEL)。
'[:digit:]'
数字字符类。包括:'0 1 2 3 4 5 6 7 8 9'。
'[:graph:]'
绘图类。包括:大小写字母、数字和标点符号。等价于
'[:lower:]'
小写字母类。包括:'a b c d e f g h i j k l m n o p q r s t u v w x y z'。
'[:print:]'
打印字符类。包括:大小写字母、数字、标点符号和空格。等价于字符类'[:alnum:]'与字符类'[:punct:]'和空格的和。
'[:punct:]'
标点符号类。包括:'! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ' { | } ~'。
'[:space:]'
空格字符类。包括:空格、制表符、垂直制表符、换行符、回车符和分页符。
'[:upper:]'
大写字母类。包括:'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'。
'[:xdigit:]'
十六进制类。包括:'0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f'。
例如,"[[:alnum:]]"表示"[0-9A-Za-z]","[^[:digit:]]"表示[^0123456789],"[ABC[:digit:]]"表示"[ABC0-9]"。注意,字符类必须包含在额外的中括号内。
中括号中的大多数元字符都丢失了它们特殊意义,而成为普通的字面符号。
']'
该符号表示中括号的结束。如果要匹配该字面字符,则必须将其放在字符列表的最前面。即"[]...]"。
'[.'
该符号表示排序符号的开始。
(注:排序类需要在字符集中预先定义好才能使用。例如[.ab.]表示将“ab”作为整体匹配,不匹配a或b。但默认情况下,字符集里肯定是没有定义好"ab"这个排序整体的,所以无法使用)
'.]'
表示排序符号的结束。
'[='
表示等价类的开始。
(注:例如,[=e=]表示将字母e的第一声和第三声等不同音节的同字母看成相同字符。)
'=]'
表示等价类的结束。
'[:'
表示字符类的开始。
':]'
表示字符类的结束。
'-'
该字符是范围连接符,因此要匹配该符号的字面意义,需要将其放在列表的最前面或最后面或作为范围的结束字符。
'^'
该字符表示不在列表中的字符。如果想匹配该字符的字面意义,则必须不能放在列表的第一个字符。
反斜线"\"后使用特定的字符表示特殊意义,如下:
'\b'
匹配单词边界处的空字符。 (注:grep中的单词有数字、字母和下划线组成,其他所有字符都是单词的分隔符。)
'\B'
和"\b"相反,表示匹配非单词边界的空字符。
'\<'
匹配单词起始位置处的空字符。
'\>'
匹配单词结束位置处的空字符。
(注:所以\bWORD\b等价于\<word\>。另外,grep选项"-w"也表示匹配单词边界)
'\w'
匹配单词成分的字符。是[_[:alnum:]]的同义词。
'\W'
匹配非单词成分的字符,是[^_[:alnum:]]的同义词。
'\s'
匹配空白字符,是[[:space:]]的同义词。
'\S'
匹配非空白字符,是[^[:space:]]的同义词。
例如,"\brat\b"匹配被分割后的"rat","\Brat\B"匹配"crate"但不匹配"furry rat"。
3.4 Anchoring(锚定)脱字符"^"以及美元符"$"是锚定元字符,分别匹配行首和行尾的空字符。
3.5 Back-references and Subexpressions(后向引用和子表达式)