.
.
名称
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之后介绍:
-
^
-
在字符串的开头匹配
-
$
-
在字符串的结尾匹配
-
(?=
re
)
-
向前肯定,匹配任何以
re开始的子字符串。
-
(?!
re
)
-
向前否定,匹配任何不以
re开始的子字符串。
向前约束可能不包含向后,所有的括号都不捕获。
一个正则表达式不能够以"/"结尾。
中括号表达式
一个中括号表达式是在"[]"中的一系列字符,一般匹配一个在这一系列字符中的一个字符,如果以"^"开头,就匹配任何不在这一系列字符中的字符。
如果两个字符以"-"隔开,可以指定两个字符的区间,[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
-
代表/字符,可以取代//
-
/c
X
-
X是任何字符,字符的低5位与X相同,其它位为0
-
/e
-
ESC符,/u001B
-
/f
-
换页符,与c语言相同
-
/n
-
换行符,与c语言相同
-
/r
-
回车符,与c语言相同
-
/t
-
水平制表符,与c语言相同
-
/u
wxyz
-
wxyz是四个严格的十六进制符,16位Unicode字符编码
-
/U
stuvwxyz
-
stuvwxyz是八个严格的十六进制符,可以代表32位Unicode字符编码
-
/v
-
垂直制表符,与c语言相同
-
/x
hhh
-
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是一个或多个字母字符。
-
b
-
余下的模式是一个基本的正则表达式
-
c
-
大小写敏感的匹配,默认情况
-
e
-
余下的模式是一个扩展的正则表达式
-
i
-
大小写不敏感的匹配
-
m
-
与n相同
-
n
-
换行符敏感匹配,有lineanchor和linestop模式
-
p
-
部分换行符敏感匹配,只有linestop模式
-
q
-
余下的模式是一个普通的字符串
-
s
-
换行符不敏感,默认情况
-
t
-
严格语法,默认情况
-
w
-
与p相反,只有lineanchor模式
-
x
-
空白字符和在#之间的注释被忽略掉的扩展语法
嵌入式的可选项使用)终结,只有在ARE中存在。