规则表达式[本文翻译得很糟,纯粹路过]
******
规则表达式是一种字符串描述方式。用多个操作符号联合构造来算术一个字符串是否符合表达。grep能理解
两种不同的规则表达式,基本的BRE和增强的ERE。在GNU的grep里,BRE和ERE有着相同的有效功能。在其他实现功能中,BRE要弱一些。以下
的描述是针对ERE而言的,不同点将在之后的总结中提到。
规则表达式的基本原理是使用一个简单的字符来匹配一个或者多个字符。大部分的字符,包括字符和数字,将匹配他们自己。任何特殊字符都有自己的特殊用途,如果要引用他们本身,请加反斜线。
一个规则表达式可能重复地包含以下运算符:[]里为注释
[点] 匹配任何一个简单字符(数字或者字母)
?[问号] 可选,用在表达式前面将匹配最多一次
*[星号]在表达式前面匹配0或者若干次
+[加号].......匹配至少一次
{N}[大括号里一个自然数N]....匹配精确到N次,包含N
{N,}[大括号里数N后有一个逗号]....匹配至少N次,包含N
{N,M}[大括号里数N和M中间有一个逗号]....匹配N到M次,包含N和M
两个表达式可以组成一个联立表达式,联立表达式匹配的结果是两个独立表达式的集合的总共。
两个规则表达式可以被操作符!联立。
重复的优先于联立,优先交替。整个子表达式可能会2因为优先顺序问题而失效。
1字符家族
===
一个方括号表达式是一个字符列表被方括号包围的。它匹配字符清单中的任何一个,如果第一个字符是^则是否定的意思,将匹配在列表中的字符例如,规则表达式'[0123456789]'将匹配任何简单的数字。
在
一个方括号表达式中,范围表达包含两个字符被一个“-“连接。它匹配任何一个位列两个字符(排序)范围之间的简单字符,包含这两个字符。例如在默认C现
场,[a-d]等价[abcd]。许多现场排序字符使用字典排序,在这种情景将等价于[aBaCcDd]。想获得传统解释,可以使用'LC_ALL'环境
设定C场所。
最后,一些已经被预定义的字符家族如下。这些家族的含义是依照LC_CTYPE环境而定的。
[:alnum:] = [:alpha:] + [:digit:]
[:alpha:] = [:lower:] + [:upper:]
[:blank:]: 空格与指标符
[:cntrl:]: 控制字符。在ASC2中,000-037,177(del)共39个。在其他字符集中,都是等价的。
[:digit:]: 数字,1,2,3,4,5,6,7,8,9
[:graph:] = [:alnum:] + [:punct:]
[:lower:] = 小写字符
[:print:] = [:alnum:]+[:punct:]+空格
[:punct:]:标点符号,!"#$%&'()*+,-./:;<=>?@[\]^_{|}~ 共32个
[:space:]:空格符号,tab,newline新行,vertical tab, from feed,carriage return and space
[:upper:]:大写字母
[:xdigit:]:十六进制符, [0-9]+[A-F]+[a-f]
例如,`[[:alnum:]]' 代表 `[0-9A-Za-z]',考虑到成形取决于场地设定和字符集,除非后者依赖C和ASC2字符集。(注意,使用这些字符家族作为构架的一部分,必须被包含在高级支架定界列表中)
大部分合成词都将失去专门的意义,在列表中。
] 如果不是字符清单的第一项,则表示列表的结束。如果你想使用]符作为一项,你必须把它放在第一位。
[. 代表开始匹配符号 /**/
]. 代表结束匹配符号 /**/
[= 代表等价类的开始符
=] 代表等价类的结束符
[: 代表字符家族的开始符,后面跟字符家族名称
:] 代表字符家族的结束符
` 代表范围不是字符清单第一个或最后一个范围。
^ 代表字符不在字符清单中。如果你想把^符放到起字符列表中,不要放在第一项。
5.2反斜线字符
===
反斜线后面跟某些模同字符有着特别的含义。
\b 匹配一个空字符串,在单词的边界
\B 匹配一个空串,不在单词的边界
\< 匹配空串,在单词的开始
\>匹配空串,在单词的结束
\w 匹配单词元素,是 [[:alnum:]] 的同名词
\W 不匹配的单词愿书,是 [^[:alnum:]] 的同名词
例如,\brat\b 将匹配被隔离的单词rat, c\Brat\Be 将匹配 crate ,但是 dirty\Brat 并不匹配dirty rat
5.3 锚
===
插入记号 ^ 和 美元符 $ 分别匹配句首和句末空串的元字符。
5.4后备符
===
\N
后备符,这里N只是一个简单的数字,匹配之前字串的第n项括号规则表达式。例如,(a)\1 将匹配
aa。当使用交替,如果群组不参与匹配的话,那么后备符将使匹配失效。例如 a(.)|b\1 并不匹配 ba 。当复合匹配规则表达式是被
-e选项或者-f选项(来自文件)的话,对于表达式后备符将是局部的。
5.5 BRE vs ERE
在BRE中,元字符 ? + { | ( ) 将失去专门的含义,使用它们则需要加反斜线前缀 \? \+ \{ \| \( \)。
传统的egrep不支持元字符{ ,一些egrep支持使用\{ 来取代实现。因此 轻便手本应该避免 {在egrep模型中,应该使用 [{] 去匹配一个元字符 {。
GNU
的egrep尝试支持传统的用法,通过假设 { 在规格间隔的开始并拥有特殊含义。例如shell命令bs>egrep {1'
将搜索两个字符的组合 {1 ,而不是报告报告一个规则表达式的语法错误。POSIX.2允许这样的行为作为一种增强,但在轻便手本中应该避免如次。
阅读(1279) | 评论(0) | 转发(0) |