tcl/tk参考——字符串操作re_syntax

.

.

名称

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中存在。

 

你可能感兴趣的:(正则表达式,underscore,Graph,扩展,语言,Tcl)