TCL中的正则表达式用法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TCL中的正则表达式
主要是两条命令:
(1)regexp ?switches? exp string ?matchVar? ?subMatchVar subMatchVar ...?在字符串中使用正则表达式匹配。
(2)regsub ?switches? exp string subSpec ?varName?
在字符串中基于正则表达式的替换
介绍一下常用的几个switches:
-all 在字符串中进行全部匹配或者替换,会返回匹配或者替换的总次数。
-nocase 将字符串中的大写都当成小写看待。
-indices 存在子匹配变量中不再是字符,而是index。
-- 表示后面不再是switches,而是正则表达式的模式了,即使后面紧接着是-。
例子:
(bin) 29 % set e1 {[zhou1020]}
[zhou1020]
(bin) 30 % regexp {\[([a-z]+)([0-9]+)\]} $e1 matchstring sub1 sub2
1
(bin) 31 % puts $matchstring
[zhou1020]
(bin) 32 % puts $sub1
zhou
(bin) 33 % puts $sub2
1020
下面解释一下:
Matchstring表示用正则表示式匹配的所有字符串;
Sub1表示正则表达式中的第一个子表达式(就是小括号里面的正则表达式,在这里就是([a-z]+))匹配的字符串;
Sub2表示正则表达式中的第二个子表达式(就是小括号里面的正则表达式,在这里就是([0-9]+))匹配的字符串;
如果加上-indices,得到的是字符串的索引。
(bin) 34 % regexp -indices {\[([a-z]+)([0-9]+)\]} $e1 matchstring sub1 sub2
1
(bin) 35 % puts $matchstring
0 9
(bin) 36 % puts $sub1
1 4
(bin) 37 % puts $sub2
5 8
一些需要注意的地方:
1.–表示后面是pattern,不再是switches了;
2.regsub只能替换第一个匹配的;如果要全部替换,需要加上-all选项;
3.在expect中使用正则表达式:
Expect –re “a*”:当看见-re选项,就知道后面是正则表达式,这时的*表示匹配0或者多次。就是可以匹配空字符串,a,aa,aaa……
注意Expect “a*”与上面的区别:默认是global pattern模式,相当于expect –gl “a*”,这时*表示任何一个字符。这时匹配aa,ab,ac……。
4.[ ]的两种用法:
(1)表示里面是命令
(2)用在正则表达式里面,表示里面是一个范围。如[0-9],[a-zA-Z]
5.^的两种用法
(1)表示从头开始匹配
(2)用在正则表达式的[]里,表示取反。如[^0-9]表示除了数字0-9之外的。
6.Quantifiers量词
*:表示0到多次
+:表示一到多次
?:表示0到一次。
7.一个容易弄错的地方
.*:表示匹配任何字符串。(因为.表示任何字符,而*表示0次或者多次,故*:表示匹配任何字符串)
同时,*是贪婪的,它希望得到最长的字符串。如果想关掉贪婪属性,可以在后面加?。
.*\n:表示尽可能多的,以回车换行符作为结束。
看下面的例子:
(bin) 44 % set a {1111
2222
3333
}
1111
2222
3333
(bin) 45 %
(bin) 45 % regexp .*\n $a match
1
(bin) 46 % puts $match
1111
2222
3333
(bin)可以看出,它在遇到第一行结束的回车换行并没有结束,而是贪婪的匹配到了最后一个回车换行。
如果只想得到第一行的1111,可以关掉*的贪婪属性。
(bin) 47 % regexp .*?\n $a match
1
(bin) 48 % puts $match
1111
(bin)
也可以用regexp "\[^\n]*\n" $a match达到目的。
(bin) 49 % regexp "\[^\n]*\n" $a match
1
(bin) 50 % puts $match
1111
(bin) 51 %
8.backslash转义字符
tab键并不是有几个空格组成的。
匹配单个+:两个\经过tcl解释得到一个\,\+经过正则表达式转义得到+:
(bin) 51 % regexp "\\+" {+} e1
1
(bin) 52 % puts $e1
+
如果使用大括号,只使用一个\即可:
(bin) 53 % regexp {\+} {+} e1
1
(bin) 54 % puts $e1
+
(bin) 55 %
匹配单个\:使用中括号需要2个\,使用双引号,需要4个\.
(bin) 55 % regexp {\\} "\\" e1
1
(bin) 56 % puts $e1
\
(bin) 57 % regexp "\\\\" "\\"
1
(bin) 58 % puts $e1
\
(bin) 59 %