正则表达式

1. POSIX定义的基本正则表达式(Basic Regular Expression, BRE) , 扩展正则表达式(Extended Regular Expression, ERE)。grep 使用的是BRE, egrep 使用的是ERE。fgrep 也叫快速grep (Fast grep),这个版本匹配固定字符串而非正则表达式,也是唯一可以并行地匹配多个字符串的版本。

2. POSIX BRE 与 ERE的meta字符(元字符即特殊字符)

字符                   BRE/ERE                  模式含义

   \                      两者都可                  通常用以关闭后续字符的特殊意义。有时则是相反地打开后续字符的特殊意义,如:\(...\) 与

                                                            \{...\} 。

   .                      两者都可                  匹配任何单个的字符,但NUL除外。独立程序也可以不允许匹配换行字符。

   *                     两者都可                  匹配在它之前邻接的任何数目的单个字符(0~n),对于BRE来说,*如果置于正则表达式的第一个                                                              字符,不具有任何特殊意义。

   ^                     两者都可                  匹配紧接着的正则表达式,在行或字符串的起始处。BRE:仅在正则表达式的开头处具有特殊                                                                 含义,ERE:置在任何位置都具有特殊含义。

   $                     两者都可                  匹配前面的正则表达式,在字符串或行结尾处。BRE:仅在正则表达式结尾处有特殊含义。                                                                   ERE:置于任何位置都具有特殊含义。

  [...]                   两者都可                  方括号表达式,匹配方括号内的任一字符。连字符(-)指的是连续字符的范围(注意:范围会                                                               因为locale而有所不同,因此不具有可移植性)。^符号置于方括号里第一个字符则有反向含                                                                     义:指的是匹配不在列表内(方括号内)的任何字符。作为首字符的一个连字符或是结束                                                                         方括号( ] ),则被视为列表的一部分。所有其他的meta字符也为列表的一部分(则被视                                                                             为字面上的意义)。方括号表达式里可能会含有排序符号、等价字符集,及字符集。

\{n,m\}                  BRE                      区间表达式,匹配在它前面的单个字符重现的次数区间。\{n\}指的是重现n次;\{n, \}则为至少                                                                 重现n次,而\{n,m\}为重现n至m次。n与m的值必须介于0至RE_DUP_MAX(含)之间,后者最                                                                   小值为255。

  \(  \)                     BRE                      将\(与\)间的模式存储在特殊的"保留空间"。最多可以将9个独立的子模式存储在单个模式中。匹                                                               配于子模式的文本,可通过转义序列\1至\9,被重复使用在相同的模式里。例如\(ab\).*\1(等                                                                    同于\(ab\).*\(ab\)) ),指的是匹配于ab组合的两次重现,中间可存在任何数目的字符。

   \n                       BRE                      重复在\(与\)方括号内第n个子模式至此点的模式。n为1到9的数字,1为由左开始。

{n,m}                    ERE                      与先前提及BRE的\{n,m\}一样,只不过方括号前没有反斜杠。

   +                        ERE                     匹配前面正则表达式的一个或多个实例。

   ?                        ERE                     匹配前面正则表达式的零个或一个实例。

   |                         ERE                     匹配于 | 符号前或后的正则表达式。

 (   )                       ERE                     匹配于方括号括起来的正则表达式群。


正则表达式范例:

表达式         匹配

tolstoy          位于一行上任何位置的7个字母:tolstoy

^tolstoy         7个字母tolstoy,出现在一行的开头

tolstoy$         7个字母tolstoy,出现在一行的结尾

^tolstoy$       正好包括tolstoy这7个字母的一行,没有其他的任何字符

[Tt]olstoy       在一行上的任一位置,含有Tolstoy或tolstoy

tol.toy            在一行上的任意位置,含有tol这3个字母,加上任何一个字符,再接着toy这3个字母

tol.*toy           在一行上的任意位置,含有tol这3个字母,加上任意的0或多个字符,再继续toy这3个字母


3.  字符集、排序符合、等价字符集

字符集是以[:与:]将关键字组合括起来的POSIX字符集。

      POSIX字符集:        类别               匹配字符                                          类别            匹配字符

                                     [:alnum:]           数字字符                                        [:lower:]        小写字母

                                     [:alpha:]            字母字符                                        [:print:]          可显示的

                                     [:blank:]            空格(space)与定位(tab)字符          [:punct:]        标点符号

                                     [:cntrl:]              控制字符                                        [:space:]       空白(whitespace)字符

                                     [:digit:]              数字字符                                        [:upper:]        大写字母字符

                                     [:graph:]           非空格(nonspace)字符                   [:xdigit:]         十六进制数字

注意:排序元素、等价字符集以及字符集,都仅在方括号表达式的方括号内认可,也就是说,像[:alpha:]这样的正则表达式,匹配字符为a、l、p、h以及:,表示所有英文字母的正确写法应为[[:alpha:]]。在方括号表达式中,所有其他的meta字符都会失去其特殊含义。所以[*\.]匹配于字面上的星号、反斜杠以及句点。


4. 后向引用

BRE提供了一种叫后向引用的机制,指的是"匹配于正则表达式匹配的先前部分"。使用后向引用的步骤有两个。第一步是将子表达式包围在 \(与\) 里;单个模式里可包括至多9个子表达式,且可为嵌套结构。如:\(ab\)\(cd\)[def]*\2\1,\1指代了 \(ab\) ,\2指代了\(cd\),则\(ab\)\(cd\)[def]*\2\1 等同于 \(ab\)\(cd\)[def]*\(ab\)\(cd\)。


5. *号,可以匹配0个或者多个前面的单个字符。因此ab*c,可以"匹配1个a、0个或多个b字符以及一个c"。则这个正则表达式可以匹配的是ac、abc、abbc、abbbc、abbbbc、....


6. ^ 和 $ 这两个meta字符也叫做锚点,其用途限制正则表达式匹配时,针对要被匹配字符串的开始或者结尾处进行匹配(^跟在[^]中括号里面的意义不一样。)以下举例锚点匹配 abcABCdefDEF 字符串的范例:

模式                        是否匹配            匹配文本(红色)/匹配失败的理由

ABC                            是                   居中的第4、5、6字符:abcABCdefDEF

^ABC                          否                   限定匹配字符串的起始处

def                              是                   居中的第7、8、9个字符:abcABCdefDEF

def$                            否                   限制匹配字符串的结尾处

[[:upper:]]\{3\}             是                    居中的第4、5、6个字符:abcABCdefDEF

[[:upper:]]\{3\}$           是                    结尾的第10、11、12个字符:abcABCdefDEF

^[[:alpha:]]\{3\}            是                    起始的第1、2、3个字符:abcABCdefDEF

^与$仅在BRE的起始与结尾处具有特殊用途。在BRE下,ab^cd里的^表示的,就是自身的(^),ef$gh,同样是表示字面上的货币字符。


7. BRE运算符优先级,由高至低                                                        ERE运算符优先级,由高到低

运算符                              表示意义                                                    运算符                           表示意义

[. .] [= =] [: :]                     用于字符排序的方括号符号                        [. .] [= =] [: :]                   用于字符对应的方括号符号

\meta character               转义的meta字符                                         \meta character              转义的meta字符

运算符                             表示意义                                                     [ ]                                    方括号表达式

[ ]                                     方括号表达式                                             ( )                                    分组

\(  \)  \digit                        子表达式与后向引用                                  * + ? { }                            重复前置的正则表达式

*  \{  \}                              前置单个字符重现的正则表达式                无符号(no symbol)          连续字符

无符号 (no symbol)         连续                                                            ^   $                                锚点 

^   $                                 锚点                                                            |                                      交替


8. ERE中没有后向引用,所有\(与\)匹配就是字面上的左括号与右括号。匹配多字符上的*的处理上和BRE是相同的。在BRE和ERE中的次数重复写法是不同的,BRE中的\{5},ERE写成{5},重复10到42个q的写法,BRE中是q\{10,42\},在ERE中是q{10,42}。


9. ERE另外有两个meta字符,可以更细腻地处理匹配控制:

?      匹配于0个或一个前置正则表达式                +     匹配于1个或多个前置正则表达式

ab?c  匹配的有ac、abc                                       ab+c  匹配的有abc、abbc、abbbc,却不匹配ac


10. | 运算符,可以理解成或的意思,满足其一即可。( ) 分组可以理解成数学中的括号。


11. 正则表达式的扩展,常见的扩展为 \< 与 \>运算符,分别匹配"单词(word)"的开头与结尾。如: \<chop 匹配于 use chopsticks,但不匹配eat a lambchop,同样地, chop\>匹配于 eat a lambchop而不匹配与use chopsticks,\<chop\>,二者皆不匹配。


12. 额外的GNU正则表达式运算符

运算符            含义

\w                   匹配任何单词组成字符,等同于[[:alnum:]_]

\W                  匹配任何非单词组成字符,等同于[^[:alnum:]_]

\< \>               匹配单词的起始与结尾,如前文所述

\b                   匹配单词的起始或结尾处所找到的空字符串。这是\< 与 \>运算符的结合注意由于awk使用\b表示后退字符,因此GNU

                          awk(gawk)使用\y来表示此功能

\B                   匹配两个单词组成字符之间的空字符串

\'  \`                 分别匹配emacs缓冲区的开始与结尾。GNU程序(还有emacs)通常将他们视为与^及$同义 


13.UNIX程序及其正则表达式类型

类型          grep       sed         ed       ex/vi       more       egrep        awk        lex

BRE            *            *             *            *             *                    

ERE                                                                                   *               *            *

\< \>            *            *             *            *             *     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值