TCL中的正则表达式

http://blog.csdn.net/emilyzhang98/article/details/5063090


主要是两条命令:

(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 %


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值