正则表达式
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]*21,1指代了 (ab) ,2指代了(cd),则(ab)(cd)[def]*21 等同于 (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 * * * &; &; * * * * * (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |