TCL中的正则表达式用法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 %

相关文档
最新文档