马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学习python,无论你是打算拿他当主要开发语言,还是当辅助开发语言,你都应该学习他,因为有些时间我们耗不起。
对正则表达式有基础懂得的读者,必定不会生疏『d』、『[a-z]+』之类的表达式,前者婚配一个数字字符,后者婚配一个以上的小写英笔墨母。可是假如你用过vi、grep、awk、sed之类Linux/Unix下的工具也许会发明,这些工具固然撑持正则表达式,语法却很纷歧样,照一般习气的举措写的『d』、『[a-z]+』之类的正则表达式,常常不是没法辨认就是婚配毛病。并且,这些工具本身之间也存在差别,一样的布局,偶然必要本义偶然不必要本义。这,事实是为何呢?
缘故原由在于,Unix/Linux下的工具年夜多接纳POSIX标准,同时,POSIX标准又可分为两种派别(flavor)。以是,起首有需要懂得一下POSIX标准。
POSIX标准
罕见的正则表达式记法,实在都源于Perl,实践上,正则表达式从Perl衍生出一个显赫的派别,叫做PCRE(PerlCompatibleRegularExpression),『d』、『w』、『s』之类的记法,就是这个派别的特性。可是在PCRE以外,正则表达式另有别的派别,好比上面要先容的POSIX标准的正则表达式。
POSIX的全称是PortableOperatingSystemInterfaceforuniX,它由一系列标准组成,界说了UNIX操纵体系应该撑持的功效,以是“POSIX标准的正则表达式”实在只是“关于正则表达式的POSIX标准”,它界说了BRE(BasicRegularExpression,基础型正则表达式)和ERE(ExtendedRegularExpress,扩大型正则表达式)两年夜派别。在兼容POSIX的UNIX体系上,grep和egrep之类的工具都遵守POSIX标准,一些数据库体系中的正则表达式也切合POSIX标准。
BRE
在Linux/Unix经常使用工具中,grep、vi、sed都属于BRE这一派,它的语法看起来对照奇异,元字符『(』、『)』、『{』、『}』必需本义以后才具有特别寄义,以是正则表达式『(a)b』只能婚配字符串(a)b而不是字符串ab;正则表达式『a{1,2}』只能婚配字符串a{1,2},正则表达式『a{1,2}』才干婚配字符串a大概aa。
之以是这么贫苦,是由于这些工具的出生工夫很早,正则表达式的很多功效倒是慢慢开展演变出来的,之前这些元字符大概并没有特别的寄义;为包管向后兼容,就只能利用本义。并且有些功效乃至基本就不撑持,好比BRE就不撑持『+』和『?』量词,也不撑持多选布局『(…|…)』和反向援用『1』、『2』…。
不外明天,地道的BRE已很少见了,究竟人人已以为正则表达式“理所应该”撑持多选布局和反向援用等功效,没有的确太不便利。以是固然vi属于BRE派别,但供应了这些功效。GNU也对BRE做了扩大,撑持『+』、『?』、『|』,只是利用时必需写成『+』、『?』、『|』,并且也撑持『1』、『2』之类反向援用。如许,GNU的grep等工具固然名义上属于BRE流,但更切实的称号是GNUBRE。
ERE
在Linux/Unix经常使用工具中,egrep、awk则属于ERE这一派,。固然BRE名为“基础”而ERE名为“扩大”,但ERE其实不请求兼容BRE的语法,而是自成一体。因而个中的元字符不必本义(在元字符之前增加反斜线会作废其特别寄义),以是『(ab|cd)』就能够婚配字符串ab大概cd,量词『+』、『?』、『{n,m}』能够间接利用。ERE并没有明白划定撑持反向援用,可是很多工具都撑持『1』、『2』之类的反向援用。
GNU出品的egrep等工具就属于ERE流(更正确的名字是GNUERE),但由于GNU已对BRE做了很多扩大,所谓的GNUERE实在只是个说法罢了,它有的功效GNUBRE都有了,只是元字符不必要本义罢了。
上面的表格扼要申明了几种POSIX派别的区分[1](实在,如今的BRE和ERE在功效上并没有甚么区分,次要的差别是在元字符的本义上)。
几种POSIX派别的申明
派别
申明
工具
BRE
(、)、{、}都必需本义利用,不撑持+、?、|
grep、sed、vi(但vi撑持这些多选布局和反向援用)
GNUBRE
(、)、{、}、+、?、|都必需本义利用
GNUgrep、GNUsed
ERE
元字符不用本义,+、?、(、)、{、}、|能够间接利用,1、2的撑持不断定
egrep、awk
GNUERE
元字符不用本义,+、?、(、)、{、}、|能够间接利用,撑持1、2
grep–E、GNUawk
为了便利查阅,上面再用一张表格列出基础的正则功效在经常使用工具中的暗示法,个中的工具GNU的版本为准。
经常使用Linux/Unix工具中的暗示法
PCRE记法
vi/vim
grep
awk
sed
*
*
*
*
*
+
+
+
+
+
?
=
?
?
?
{m,n}
{m,n}
{m,n}
{m,n}
{m,n}
*
<>
<>
<>
y<>
(…|…)
(…|…)
(…|…)
(…|…)
(…|…)
(…)
(…)
(…)
(…)
(…)
12
12
12
不撑持
12
注:PCRE中经常使用来暗示“单词的肇端或停止地位”,但Linux/Unix的工具中,一般用<来婚配“单词的肇端地位”,用>来婚配“单词的停止地位”,sed中的y能够同时婚配这两个地位。
POSIX字符组
在某些文档中,你还会发明相似『[:digit:]』、『[:lower:]』之类的暗示法,它们看起来不难了解(digit就是“数字”,lower就是“小写”),但又很奇异,这就是POSIX字符组。不但在Linux/Unix的罕见工具中,乃至一些酿成言语中都呈现了这些字符组,为制止狐疑,这里有需要扼要先容它们。
在POSIX标准中,『[a-z]』、『[aeiou]』之类的记法仍旧是正当的,其意义与PCRE中的字符组也没有区分,只是这类记法的正确称号是POSIX方括号表达式(bracketexpression),它次要用在Unix/Linux体系中。POSIX方括号暗示法与PCRE字符组的最次要不同在于:POSIX字符组中,反斜线不是用来本义的。以是POSIX方括号暗示法『[d]』只能婚配和d两个字符,而不是『[0-9]』对应的数字字符。
为懂得决字符组中特别意义字符的本义成绩,POSIX方括号暗示律例定,假如要在字符组中表达字符](而不是作为字符组的停止标志),应该让它紧跟在字符组的开方括号以后,以是POSIX中,正则表达式『[]a]』能婚配的字符就是]和a;假如要在POSIX方括号暗示法中表达字符-(而不是局限暗示法),必需将它紧挨在闭方括号]之前,以是『[a-]』能婚配的字符就是a和-。
POSIX标准也界说了POSIX字符组,它近似等价于于PCRE的字符组简记法,用一个有直不雅意义的名字来暗示某一组字符,好比digit暗示“数字字符”,alpha暗示“字母字符”。
不外,POSIX中另有一个值得注重的观点:locale(一般翻译为“言语情况”)。它是一组与言语和文明相干的设定,包含日期格局、泉币币值、字符编码等等。POSIX字符组的意义会依据locale的变更而变更,上面的表格先容了罕见的POSIX字符组在ASCII言语情况与Unicode言语情况下的意义,供人人参考。
POSIX字符组
POSIX字符组
申明
ASCII言语情况
Unicode言语情况
[:alnum:]*
字母字符和数字字符
[a-zA-Z0-9]
[p{L&}p{Nd}]
[:alpha:]
字母
[a-zA-Z]
p{L&}
[:ascii:]
ASCII字符
[x00-x7F]
p{InBasicLatin}
[:blank:]
空格字符和制表符
[ ]
[p{Zs} ]
[:cntrl:]
把持字符
[x00-x1Fx7F]
p{Cc}
[:digit:]
数字字符
[0-9]
p{Nd}
[:graph:]
空缺字符以外的字符
[x21-x7E]
[^p{Z}p{C}]
[:lower:]
小写字母字符
[a-z]
p{Ll}
[:print:]
相似[:graph:],但包含空缺字符
[x20-x7E]
P{C}
[:punct:]
标点标记
[][!"#$%&()*+,./:;<=>?@^_`{|}~-]
[p{P}p{S}]
[:space:]
空缺字符
[
vf]
[p{Z}
vf]
[:upper:]
年夜写字母字符
[A-Z]
p{Lu}
[:word:]*
字母字符
[A-Za-z0-9_]
[p{L}p{N}p{Pc}]
[:xdigit:]
十六进制字符
[A-Fa-f0-9]
[A-Fa-f0-9]
注1:标志*的字符组简记法并非POSIX标准中的,但利用良多,一样平常言语中都供应,文档中也会呈现。
注2:对应的Unicode属性请参考本系列文章已刊发过的关于Unicode的部分。
POSIX字符组的利用有所分歧。次要区分在于,PCRE字符组简记法能够离开方括号间接呈现,而POSIX字符组必需呈现在方括号内,以是一样是婚配数字字符,独自呈现时,PCRE中能够间接写『d』,而POSIX字符组就必需写成『[[:digit:]]』。
Linux/Unix下的工具中,一样平常都能够间接利用POSIX字符组,而PCRE的字符组简记法『w』、『d』等则年夜多不撑持,以是假如你看到『[[:space:]]』而不是『s』,必定不要感应奇异。
不外,在经常使用的编程言语中,Java、PHP、Ruby也撑持利用POSIX字符组。个中Java和PHP中的POSIX字符组都是依照ASCII言语情况举行婚配;Ruby的情形则要庞大一点,Ruby1.8依照ASCII言语情况举行婚配,并且不撑持『[:word:]』和『[:alnum:]』,Ruby1.9依照Unicode言语情况举行婚配,同时撑持『[:word:]』和『[:alnum:]』。
申明:关于正则表达式的系列文章到此即告一段落,作者比来已完成了一本关于正则表达式的书本,个中更具体也更周全地解说了正则表达式利用中的各类成绩。该书暂命名《正则扶引》,估计近期上市,有乐趣的读者敬请存眷。
[1]关于ERE和BRE的具体标准,能够参考http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html。
关于作者
余晟,程序员,曾任抓虾网初级参谋,现就任于昌大立异院,感乐趣的偏向包含搜刮和散布式算法等。翻译喜好者,译有《精晓正则表达式》(第三版)和《手艺向导之路》,今朝正在写作《正则表达式傻瓜书》(暂命名),但愿为国际开辟偕行奉献一本有用的正则表达式教程。
要明白学好linux不是一件一蹴而就的事,一定要能坚持使用它,特别是在使用初期。 |