.
.
名称
re_syntax - Tcl正则表达式语法描述
正则表达式描述了字符串中的字符,它是一个匹配特定的字符串而不匹配其他的字符串的模式。不同的正则表达式
正则表达式是由POSIX定义的,有两种形式,扩展的正则表达式(Extended RE)和基础正则表达式(Basic RE),EREs就是传统上说的egrep,BREs就是ed,还有第三种形式,基于EREs添加一些重要的扩展,叫做高级正则表达式(Advanced RE)。这个用户手册主要描述AREs,BREs经常出现在需要向后兼容的程序当中,POSIX的EREs是AREs的一个子集,属于AREs但是不属于EREs的特性将会简单的指出来。
正则表达式语法
Tcl正则表达式使用Henry Spencer写的包来实现,基于POSIX 1003.2并参照了Perl5的扩展,本文中很多正则表达式的描述是直接复制Henry Spencer的用户手册。一个ARE有一个或多个由"|"分开的分支,匹配任何需要匹配的分支。
一个分支是一个或多个约束和量化元字符,它首先匹配好一个匹配,然后再进行第二个匹配,以此类推,空分支就匹配空字符串。
量词
一个量化元字符是由一个元字符后面紧接着一个简单的量词组成,如果没有量词,就只匹配这个元字符,量词如下:-
*
- 匹配0个或多个元字符的序列 +
- 匹配1个或多个元字符的序列 ?
- 匹配0个或1个元字符的序列 {m}
- 严格匹配m个元字符的序列 {m,}
- 匹配m个或多个元字符的序列 {m,n}
- 匹配m个到n个元字符的序列 *? +? ?? {m}? {m,}? {m,n}?
- 非贪婪量词,与贪婪量词匹配的方式相同,但是非贪婪两次只匹配最少能匹配到的序列,而贪婪匹配需要匹配最多能匹配的序列。
使用{和}的形式需要受限,m和n必须是无符号整数,取值在0到255之间。
元字符
元字符是以下几种形式:-
(re)
- 将一个元字符括起来(re是任意正则表达式)。 (?:re)
- 与上面相同,但是不报告(不捕获括号的配置) ()
- 匹配一个空字符串 (?:)
- 与上面相同,但是不报告 [chars]
- 一个中括号表达式,匹配任何一个chars中的字符。 .
- 匹配任意一个字符 /k
- 匹配非字母和数字字符 /c
- 匹配escape项目中所罗列的字符 {
- 当后面不是数字时,匹配"{",当后面跟着数字时,是一个量词范围的开始(只支持AREs) x
- 当x是一个字符时就匹配这个字符
约束
在特定的条件下约束匹配一个空字符串,约束的后面不能是量词,简单的约束如下,其它的在 ESCAPES之后介绍:向前约束可能不包含向后,所有的括号都不捕获。
一个正则表达式不能够以"/"结尾。
中括号表达式
一个中括号表达式是在"[]"中的一系列字符,一般匹配一个在这一系列字符中的一个字符,如果以"^"开头,就匹配任何不在这一系列字符中的字符。如果两个字符以"-"隔开,可以指定两个字符的区间,[0-9]匹配任何十进制数字,两个范围必须是两个终点,所以"a-c-e"是不合法的。范围使用Unicode的顺序。
如果要包含]或者-,就需要使用[和]把它括起来,使用时要么把]和-放在前面,要么使用"/"。
字符类
在中括号中,字符类在[:和:]中表示字符类中的所有字符,标准的字符类如下:-
alpha
- 一个字母 upper
- 一个大写字母 lower
- 一个小写字母 digit
- 一个十进制数字 xdigit
- 一个十六进制数字 alnum
- 字母或数字 print
- 可打印的字符,与graph类似,但是包含空格符 blank
- 一个空格符或制表符 space
- 一个空格符 punct
- 一个标点符号 graph
- 一个可见的字符(包括字母、数字和标点符号) cntrl
- 控制字符,/u0001到/u001F
中括号约束
这里有两个特殊的中括号表达式:[[:<:]]和[[:>:]],用来匹配以空字符串开头的字符串,字符串由字母、数字和"_"组成,这种特殊的中括号表达式容易被忽略。可以使用转义来替代。对等元素
在一个中括号中,一个对等元素在[.和.]中表示一个元素字符,在[.和.]之间的对等元素在源代码文件generic/regc_locale.c中找到,使用一个单词来代表一个元素字符,也可以使用一个字符代表这个字符本身。(我并没有发现对等元素和等价类在tcl中的实际用途)。等价类
在一个中括号的表达式中,一个等价的元素由[=和=]括起来,代表了在相同字母顺序上的等价元素,如果o和o是一个等价类中的元素,那么, 都是同义的转义
转义,是由/跟着一个字母或数字字符,有字符转义、速记类转义、约束转义和回退引用等多种形式,在AREs中反斜杠是由意义的,但是在EREs中没有转义,/仅仅是关闭一些特殊字符的意思或者只是代表/后面的字符。字符转义
字符转义只有在AREs中才有。-
/a
- 报警和振铃字符,与c语言相同 /b
- 退格符,与c语言相同 /B
- 代表/字符,可以取代// /cX
- X是任何字符,字符的低5位与X相同,其它位为0 /e
- ESC符,/u001B /f
- 换页符,与c语言相同 /n
- 换行符,与c语言相同 /r
- 回车符,与c语言相同 /t
- 水平制表符,与c语言相同 /uwxyz
- wxyz是四个严格的十六进制符,16位Unicode字符编码 /Ustuvwxyz
- stuvwxyz是八个严格的十六进制符,可以代表32位Unicode字符编码 /v
- 垂直制表符,与c语言相同 /xhhh
- hhh是16进制数字,16进制值为0xhhh的字符(无论0x后面有多少个h都只匹配3个) /0
- NULL,值也是0 /xy
- 要么是一个十进制回退引用,要么是两个8进制字符编码。 /xyz
- 要么是一个十进制回退引用,要么是三个8进制字符编码。 16进制数字是"0-9a-fA-F",8进制数字是"0-7"
字符转义可以代表普通字符,比如/135在Unicode中是],但是/135并不代表一个中括号表达式中的],只能够代表一个字符。
速记类转义
速记类只在AREs中提供,为一些经常使用的字符类提供速记方式。-
/d
- [[:digit:]] /s
- [[:space:]] /w
- [[:alnum:]_] (note underscore) /D
- [^[:digit:]] /S
- [^[:space:]] /W
- [^[:alnum:]_] (note underscore)
约束转义
约束转义只在AREs中提供,在特殊的条件下匹配空字符串。-
/A
- 只从一个字符串的开头匹配(查看MATCHING,与^有什么不同?) /m
- 只从一个词的开头匹配 /M
- 只从一个词的结尾匹配 /y
- 只从一个词的开头或结尾匹配 /Y
- 不从一个词的开头或结尾匹配 /Z
- 只从一个字符串的结尾匹配(查看MATCHING,与$有什么不同?) /m
- m是一个非0数字,一个回退引用 /mnn
- 一个回退引用,m是一个非0数字,nn是更多的数字,但是这个十进制数值mnn不能比子模式的数量大
回退引用
回退引用只有在AREs中提供,匹配一个之前已经匹配了的子模式,引用之前匹配的字模式的值来匹配,比如"([bc])/1"匹配bb或者cc,但是不匹配bc,子表达式必须在回退引用之前。嵌入语法
除了上面描述的主语法,这里还有一些特殊的形式和混合宜用的一些语法。一个ARE可以以些嵌入的可选项开头,序列(?xyz),其中xyz是一个或多个字母字符。
嵌入式的可选项使用)终结,只有在ARE中存在。