文档库 最新最全的文档下载
当前位置:文档库 › tcl表达式

tcl表达式

tcl表达式
tcl表达式

tcl表达式:运算符和优先级

2006-09-12 22:42:0 下面的表格中列出了TCL中用到的运算符,它们的语法形式和用法跟ANSI C中很相似。这里就不一一介绍。下表中的运算符是按优先级从高到低往下排列的。同一格中的运算符优先级相同。

语法形式结果操作数类型

-a !a ~a 负a

非a

int,float

int,float

int

a*b a/b a%b 乘

取模

int,float

int,float

int

a+b a-b 加

int,float

int,float

a<>b 左移位

右移位

int

int

ab a<=b a>=b 小于

大于

小于等于

大于等于

int,float,string

int,float,string

int,float,string

int,float,string

a= =b 等于int,float,string

a!=b 不等于int,float,string

a&b 位操作与int

a^b 位操作异或int

a|b 位操作或int

a&&b 逻辑与int,float

a||b 逻辑或int,float

a?b:c 选择运算a:int,float

tcl表达式:数学函数

2006-09-12 22:45:0 TCL支持常用的数学函数,表达式中数学函数的写法类似于C\C++语言的写法,数学函数的参数可以是任意表达式,多个参数之间用逗号隔开。例如:

%set x 2

2

% expr 2* sin($x<3)

1.68294196962

其中expr是TCL的一个命令,语法为: expr arg ?arg ...?

两个?之间的参数表示可省,后面介绍命令时对于可省参数都使用这种表示形式。 expr可以有一个或多个参数,它把所有的参数组合到一起,作为一个表达式,然后求值:

%expr 1+2*3

7

%expr 1 +2 *3

7

需要注意的一点是,数学函数并不是命令,只在表达式中出现才有意义。TCL中支持的数学函数如下

abs( x) Absolute value of x.

acos( x) Arc cosine of x, in the range 0 to p.

asin( x) Arc sine of x, in the range -p/2 to p/2.

atan( x) Arc tangent of x, in the range -p/2 to p/2.

atan2( x, y) Arc tangent of x/ y, in the range -p/2 to p/2.

ceil( x) Smallest integer not less than x.

cos( x) Cosine of x ( x in radians).

cosh( x) Hyperbolic cosine of x.

double( i) Real value equal to integer i.

exp( x) e raised to the power x.

floor( x) Largest integer not greater than x.

fmod( x, y) Floating-point remainder of x divided by y.

hypot( x, y) Square root of ( x 2 + y 2 ).

int( x) Integer value produced by truncating x.

log( x) Natural logarithm of x.

log10( x) Base 10 logarithm of x.

pow( x, y) x raised to the power y.

round( x) Integer value produced by rounding x.

sin( x) Sine of x ( x in radians).

sinh( x) Hyperbolic sine of x.

sqrt( x) Square root of x.

tan( x) Tangent of x ( x in radians).

tanh( x) Hyperbolic tangent of x.

TCL中有很多命令都以表达式作为参数。最典型的是expr命令,另外if、while、for等循环控制命令的循环控制中也都使用表达式作为参数。

TCL中的合法的list

2006-09-12 22:52:0 list这个概念在TCL中是用来表示集合的。TCL中list是由一堆元素组成的有序集合,list可以嵌套定义,list每个元素可以是任意字符串,也可以是list。下面都是TCL中的合法的list:

{} //空list

{a b c d}

{a {b c} d} //list可以嵌套

list是TCL中比较重要的一种数据结构,对于编写复杂的脚本有很大的帮助,TCL提供了很多基本命令对list进行操作,下面一一介绍:

list命令

语法: list ? value value...?

这个命令生成一个list,list的元素就是所有的value。例:

% list 1 2 {3 4}

1 2 {3 4}

concat命令

语法:concat list ?list...?

这个命令把多个list合成一个list,每个list变成新list的一个元素。

lindex命令

语法:lindex list index

返回list的第index个(0-based)元素。例:

% lindex {1 2 {3 4}} 2

3 4

llength命令

语法:llength list

返回list的元素个数。例

% llength {1 2 {3 4}}

3

linsert命令

语法:linsert list index value ?value...?

返回一个新串,新串是把所有的value参数值插入list的第index个(0-based)元素之前得到。例:

% linsert {1 2 {3 4}} 1 7 8 {9 10}

1 7 8 {9 10}

2 {

3 4}

lreplace命令

语法:lreplace list first last ?value value ...?

返回一个新串,新串是把list的第firs (0-based)t到第last 个(0-based)元素用所有的value参数替换得到的。如果没有value参数,就表示删除第first到第last个元素。例:

% lreplace {1 7 8 {9 10} 2 {3 4}} 3 3

1 7 8

2 {

3 4}

% lreplace {1 7 8 2 {3 4}} 4 4 4 5 6

1 7 8

2 4 5 6

lrange命令

语法:lrange list first last

返回list的第first (0-based)到第last (0-based)元素组成的串,如果last的值是end。就是从第first个直到串的最后。

例:

% lrange {1 7 8 2 4 5 6} 3 end

2 4 5 6

lappend命令

语法:lappend varname value ?value...?

把每个value的值作为一个元素附加到变量varname后面,并返回变量的新值,如果varname不存在,就生成这个变量。例:

% lappend a 1 2 3

1 2 3

% set a

1 2 3

lsearch命令

语法:lsearch ?-exact? ?-glob? ?-regexp? list pattern

返回list中第一个匹配模式pattern的元素的索引,如果找不到匹配就返回-1。-exact、-glob、 -regexp是三种模式匹配的技术。-exact表示精确匹配;-glob的匹配方式和string match命令的匹配方式相同,将在后面第八节介绍string命令

时介绍;-regexp表示正规表达式匹配,将在第八节介绍regexp命令时介绍。缺省时使用-glob匹配。例:

% set a { how are you }

how are you

% lsearch $a y*

2

% lsearch $a y?

-1

lsort命令

语法:lsort ?options? list

这个命令返回把list排序后的串。options可以是如下值:

-ascii 按ASCII字符的顺序排序比较.这是缺省情况。

-dictionary 按字典排序,与-ascii不同的地方是:

(1)不考虑大小写

(2)如果元素中有数字的话,数字被当作整数来排序.

因此:bigBoy排在bigbang和bigboy之间, x10y 排在x9y和x11y之间.

-integer 把list的元素转换成整数,按整数排序.

-real 把list的元素转换成浮点数,按浮点数排序.

-increasing 升序(按ASCII字符比较)

-decreasing 降序(按ASCII字符比较)

-command command TCL自动利用command 命令把每两个元素一一比较,然后给出排序结果。

split命令

语法:split string ?splitChars?

把字符串string按分隔符splitChars分成一个个单词,返回由这些单词组成的串。如果splitChars

是一个空字符{},string被按字符分开。如果splitChars没有给出,以空格为分隔符。例:

% split "how.are.you" .

how are you

% split "how are you"

how are you

% split "how are you" {}

h o w { } a r e { } y o u

join命令

语法:join list ?joinString?

join命令是命令的逆。这个命令把list的所有元素合并到一个字符串中,中间以joinString分开。缺省的joinString是空格。例:

% join {h o w { } a r e { } y o u} {}

how are you

% join {how are you} .

how.are.you

Tcl的历史

2006-09-20 13:10:0

人们常常问我设计Tcl语言的目的是什么,为什么它会变得这么受欢迎。本文将重温一下当年产生设计Tcl和Tk的想法,回顾Tcl和Tk在过去十年间发展的过程,以及我从伯克利到sun到scriptics的人生经历。你将看到,起初Tcl是很简陋的;这个系统的成功令我很吃惊,其实我也是通过回顾它的历史才开始明白T cl流行的原因是什么。

Tcl的诞生

Tcl脚本诞生于80年代初,我在加州大学伯克利分校的项目“集成电路设计工具”的研究。那时,我和我的学生已经写出了许多用于IC设计的交互工具,如Magic和Crystal。每个工具都需要一个命令语言(在那个年代,人们需要键入命令才能使用这些工具;图形用户界面还没有被广泛的使用)。不过我们的研究重点是工具而不是它们的命令语言,所以我们没有在命令语言上投入太多的精力,结果语言方面变得很薄弱。更糟的是,每个工具的语言之间是互不相通的。这样一来,经过一段时间后,就变得相当棘手。

1987年秋,在DE C的西部研究所的假期中,我有了设计一种嵌入式命令语言的想法。这个想法就是花费一些精力去创建一种优秀的解释型语言,然后进一步把它做成一个能够在许多不同的应用程序中重复利用的库包(library package),语言的解释器要提供一系列相对通用的工具,如变量,控制结构,过程。每个使用这个语言的程序都可以以扩展的形式把自己的功能加到语言中,达到用语言来控制程序的目的。Tcl的全称“工具命令语言”正说明了这一点。

可嵌入性是Tcl的特点之一,为了实现这个想法,我准备在以下三个方面进行着手:

★这个语言必须是可扩展的:它应该能够让每个应用程序可以很方便的把自己的功能加到语言的基本功能中,并且程序的特定功能必须使用起来非常自然,就好像一开始就是为这个语言设计的一样。

★这个语言必须非常的简单通用,能很方便的与许多不同的应用程序配合工作,而不会限制应用程序的功能。

★由于大部分出色的功能都来自于应用程序,所以这个语言的首要目的就是将扩展部件整合或“胶合”在一起,因此它必须要有很好的整合性能。

1988年初,假期一结束,我就开始着手设计Tcl的工作了。1988年春天的时候,我开始在一个图形化的文本编辑器中使用第一个版本的Tcl。在我停止IC设计工具的相关研究之前,Tcl的实验还大部分停留在理论阶段。当时我想除了我

Tk的诞生

那时,我对图形用户界面也很感兴趣。80年代图形用户界面逐渐流行的时候,我注意到交互式软件的复杂性正在迅速的增长,最引人注目的发展趋势看起来好像是对巨额投资的庞大项目的需求在不断增加。作为一名教授,实验条件不是很充足,这使我开始担心像我们这样类似小团队的研究所是不是就不可能再做出交互式的系统了。

我得出的结论是,我们的唯一希望就是减少创建大型系统时除可重复利用的部件以外的部分对资源的需求,如果一个系统最复杂的地方是用部件来完成的,而且可以把部件从一个系统移植到另一个系统,也许我们就可以以小团队的规模来创建强大的系统,这要求花费一些精力来开发这些部件。不过如果有几个小组协同工作的话,完成它只是一个时间的问题。

我也在考虑这样一个问题,要想使基于组建的设计能够实现,需要有一个强大的有弹性的控件整合工具。这些想法在我一开始考虑做Tcl的时候就产生了,我觉得像Tcl这样的嵌入式命令语言作为脚本语言对整合部件会很有用。我决定创建一些作为Tcl扩展的GUI部件并且使用Tcl来把这些部件整合到图形用户界面中,借此实践一下这个理论。这个扩展就成为了Tk。

我1988年末开始做Tk。这只是一个兼职的项目,所以用了两年的时间才使Tk具有了一些实用的功能。

早期的集成套件

我已经记不清是什么时候开始让人们使用Tcl了,我记得我在伯克利“产学研大会”上作了一个关于Tcl的演讲,来自工业界的几百名与会者听了我们系的这个研究成果。我还被一些对此感兴趣的公司邀请去做演讲。在这几次演讲期间,一些人向我要Tcl的拷贝,于是在1989年,这一部分人最早接触到了Tcl。

1990年1月,我在USE NIX会议上宣读了一篇关于Tcl的论文,听众有几百人。他们对Tcl的兴趣越来越浓厚,许多人开始向我要Tcl。大约在那个时候,我决定在伯克利的FTP站点上免费发放Tcl的源代码。从此,通过因特网,T cl 的用户开始与日俱增。

这个程序能够自动的操作交互的UNIX应用程序,但这需要一种优秀的命令语言,而Don没有时间自己编写这样的一个语言。于是这个项目只能搁置在一边。听了我的演讲后,Don立即跑回家,下载了Tcl,编写了一个叫做E xpect的非常优秀的程序,并且赶在下一次USE NIX会议提交论文的最后期限之前完成了一篇关于它的论文。整个过程只用了三个星期。Don在1990年夏发表了他的论文之后,把E xpect免费的提供给人们使用,于是在系统管理员界立即引起了一场不小的震动。E xpect不仅是第一个广泛发布的Tcl应用程序,而且多年来一直也是最流行的。许多早期的Tcl用户都是通过使用E xpect来了解到Tcl的。

在1990年末,Tk的基本功能变得很实用了,1991年1月,我同时在USENIX会议和X应用程序开发者大会上发表了一篇关于Tk的论文,这两次会议期间的几个星期中,我在因特网上发布了第一个Tk版本。Tk的第一版缺少许多重要的构件(比如,没有多行文本框构件),不过到了1992年夏天的时候,我就把文本框构件和一个强大的画布构件加了进去。这时Tk的用户开始迅速增长。

开始变得受欢迎

Tcl/Tk的用户从1990年初开始每年都在迅速增加。从1989年的几个使用者到1993年的成百上千的使用者,导致这种迅速增长的原因主要有两个方面:

Tcl/Tk使用者增加的第一个原因是:它提供了最简单的在UNIX(那时Tcl只能在UNIX系统下运行)下开发图形用户界面的方法。Tk的GUI工具既简单又强大;所编写出的出色的应用程序可以完全由Tcl编写而不用写一句C代码,换成基于C的工具来开发比如Motif工具则要变得复杂得多,而且功能也比较少。人们很快就发现用Tcl来开发GUI比起用Motif来可以少投入5到10倍的精力,这也证明了在工业界有许多人和我一样很关心开发交互式应用程序的高开支问题。

Tcl流行的第二个原因是它的可嵌入特性。在我开始做Tcl的时候,我猜想除了我没有人会想要可嵌入式的命令语言,但是我错了。包括Don Libes在内的许多人都想要编写脚本式的可扩展的应用程序,但却没有时间自己来创建这么一种语言。正因为可嵌入式的特性,Tcl为他们提供了一个完美的解决方案。结果Tcl一推出就被广泛的用于股票交易,科学观测,生产自动化等许多领域。

在Tcl用户之间每一两年都会有对Tcl和Tk的使用的讨论,许多Tcl的使用者认为Tk是他们使用T cl的唯一原因,他们中的一些甚至不喜欢Tcl语言,而希望Tk能够和其他的脚本语言结合。(实际上,已经有人这么做了,如Tkperl和

由于Tcl能够满足他们的特殊目的,所以他们很喜欢Tcl,从某种意义上说,这两部分人都没错。

Tcl社区

90年代初随着T cl使用者的增加,人们在网上建立了一个关于这门语言的社区,目的是让大家发布功能强大的扩展和为新的用户提供帮助。Mark Diekhans和Karl Lehenbauer是早期开创者中的两位,。他们编写了Tclx,最早可用的Tcl 扩展之一,Tcl x提供了对文件的访问,时间和日期控制,以及许多其它有用的工具。随着时间的推移,Tclx的功能被证明是非常重要的,以至于其中的许多功能已经被整合到了Tcl的基本功能中。

许多早期的Tcl开创者编写了大量高质量的扩展并使这些扩展能够免费的使用,比如Michael Mclennan编写的[incr Tcl],为Tcl提供了面向对象的功能。George How lett编写的BLT为Tk加进了许多重要的构件。Tom P oindexter编写的S ybtcl 和Oratcl,提供了对主流数据库的访问。Brian Smith和Lary Rowe编写的T clDP提供了Socket接口及一些有用的编程功能。还有许多贡献者我已经记不太清了,在此我只能表示歉意。

社区中其他的论坛在这个时期也在发展。我起初为社区中的用户建立了一个邮件列表,但是短短几年里,这个列表变得相当冗长,以至于后来无法控制。在社区的帮助下,我们建立了https://www.wendangku.net/doc/c717255873.html,ng.tcl新闻组来代替原来的邮件列表,从此,它就成为了交换信息和讨论Tcl新功能的绝佳地点。

1993年Larry Rowe意识到社区中的人们需要面对面的交流。于是他在伯克利组织了第一届T cl专题讨论会,大约有60人参加。由于这次大会开得非常成功,所以我们决定把它定为一年一届。1995年,USENIX协会开始对这个讨论会进行资助。从此,它就变为了一个有几百人参加的,发表大量论文、教程,开展众多活动的全方位的大会。Tcl大会也是世界上最大的参加者上身着装统一的大会之一,每年要分发5-10种不同设计图案的短袖衫来区别不同的扩展和活动。

在这段时间里,我大约每6到10个月发布一次Tcl/Tk的新版本。大部分新的功能都是采用的Tcl社区的建议。有时,使用者甚至直接给我提供新功能的源代码,然后,我再把它加到软件的核心代码中。通常,每次新版本发布前都有一个讨论的过程,我提供一份新功能的候选列表,然后在社区中由大家投票选出他们认为最重要的功能。我尽可能优先考虑得票最多的功能。

Ouster的得票

后来Tcl的发布周期就慢慢趋向于和T cl大会保持一致。新版本通常在大会期间发布,这样我们就可以在大会中拿出一段时间来组织讨论下一个版本要加入的新功能,然后得到反馈信息。我经常让与会者即兴的举手表决,统计一下听众对一些问题的想法,然后对举手的人数做个大概的统计(“10,20,30,…,看起来我大约得了35票”)这些票数被大家称之为“ouster的得票”,得票数也常常被大家当作话题来讨论。不过一些人开玩笑说我的得票数一点也不客观…

在sun公司的日子

1994年我决定离开伯克利投身工业界。过去我就一只想在工业界做兼职工作,在学术界干了14年,现在我看时机已经成熟了。在考虑了多方面的因素后,我决定接受sun公司的邀请。E ric S chmidt,sun公司的首席技术官和Bert Sutherland,sun实验室的领导者,给我提供了一个机会,在sun实验室创立一个小组,将Tcl开发成因特网上通用的脚本语言。

我一直觉得Tcl最终需要进行商业赢利才能在长远的开发中生存下来,sun公司为T cl向更高性能的发展提供了很好的机会。我在1994年5月加入sun公司,然后组建了一个Tcl开发小组,在以后的3年里,sun的Tcl小组成员发展到了12人,以前基本上Tcl/tk的每一行代码都有我亲自来编写,但是从那以后,编写Tcl代码的工作就由Tcl小组来完成了。

Sun公司提供的许多帮助使我们对Tcl/Tk的性能进行了大规模的提升。S cott Stanton 和Ray Johnson将Tcl/Tk输出到了Windows和Macintosh上,于是Tcl就成了一个跨平台的开发环境;当前,超过2/3下载Tcl的用户是用于Windows 开发。Jacob Levy和Scott Stanton仔细测试了输入输出系统并加进了对Socket的支持,于是Tcl可以被广泛的用于网络应用程序。Brian Le w i s为Tcl脚本创建了一个二进制编译器,这使它的运行速度提升了10倍。Jacob Levy开发了Safe-T cl,一个强大的安全模块,使非信任的脚本能更安全的执行。Jacob Levy和Laurent Demailly创建了一个Tcl插件,使Tcl脚本可以在web浏览器中运行,我们创建了Jacl和TclBlend,使Tcl和Java可以紧密的工作在一起。我们还进行了一些小的改进,如动态加载,名称空间,时间和日期支持,二进制I/O,额外的文件操作命令,和一个改进的字体机制。

当我加盟sun后,许多人担心Tcl是否会变成一个收费的语言,当时在https://www.wendangku.net/doc/c717255873.html,ng.tcl上出现了许多热烈的讨论。幸运的是,sun公司同意在源代码论坛中继续发放Tcl/Tk的核心代码库,并且sun一直信守诺言。随着性能不断提升的新版本的出现,起初那些担心逐渐被开发新功能的热情所代替。

由1995年底的2000人每星期上升到1998年初的超过10000人每星期。很明显,Tcl对我是一个巨大的商业机会。开放源代码的发展满足不了Tcl社区中的许多要求。比如,几乎没有开发Tcl的工具,像培训和技术支持这样的专业服务也仅仅是零散进行的。许多重要的扩展,如对Acti v eX和CORBA的支持还没有编写出来。

Ajuba

1997年底,为了更好的发展T cl,我决定离开sun创建一个完全关注于Tcl的公司。1998年1月,我和Sarah Daniels 创建了S criptics(即今天的 Tcl),由Sarah负责市场营销。一个月内,sun公司Tcl小组的约一半成员都跳槽加入了我们公司,我们开始开发TclP ro,一套包括我们最初产品的开发工具。TclP ro 1.0 于1998年9月完成。它在市场上的成功为Ajuba的出现提供了强有力的支持。1999年底我们准备再雇佣50名员工。

Tcl公司已经代替了sun公司在开发Tcl核心工具上的角色,并且它将继续像sun公司那样免费的发布它。1998年,Tcl 公司为Tcl8.0做了一些改进,修复了一些错误并加进了一些小的功能,比如可以更好的支持[Incr Tcl]扩展。1999年4月,Tcl发布了第一个最重要的开放源码的版本,Tcl/Tk8.1,这个版本加进了对Unicode的支持(国际化),线性安全机制(用于多线程服务程序)和一个由Henry Spencer开发的全新的规则表达式包,还有一些类似对Unicode提供支持这样优秀的新功能。Tcl成为第一个满足企业中关键程序各方面要求的脚本语言。

今后,Tcl将会继续开发开放源代码的和进行商业赢利的两种产品,在这种理念下,我们会不断的提升开放源代码的核心部件的性能,改进产品的不足,为免费的和商品化的两种开发工具提供资金支持,我们要做就要做到最好。Tcl社区将一如既往的在Tcl的发展中扮演重要的角色。

ActiveState

这一部分的作者是Jeff Hobbs

Ajuba创建了基于Tcl的企业版的XML类服务应用程序,后来它被Interwoven于2000年10月收购。不过Interwoven 对开放源码的软件不感兴趣,他们只关注XML和服务器的相关产品。Jeff Hobbs,前Tcl Scriptics/T cl的代理人,跳槽到Acti v e State(以发布P erl的产品和开发工具闻名)来领导他们的Tcl技术部。

者。

Tcl:屡获大奖的软件

1998年春,我听到了几个令人振奋的消息,T cl获得了两项重要的奖项。一个是ACM软件系统大奖,奖给每年的“具有长远影响的软件系统”。以往这个奖项的获得者包括许多重要的系统如TCP/IP协议,第一个线性表,第一个关系数据库,因特网,Unix系统,P ostScript,Smalltalk。另一个是USE NIX软件工具用户组织(STUG)大奖,这个奖项奖给年度优秀的软件工具。

未来的版本

整合性的程序将会继续发展下去,因为越来越多的企业发现他们的竞争力取决于能否使他们的计算机系统有效的协同工作。Tcl为建立这些整合程序提供了非常强大的平台。今后,当那些首席技术官们在设计他们将来的信息系统结构的时候,我相信对整合性的平台的重视,就会像现在对操作系统平台和数据库平台的重视一样,会放在首要考虑的位置。我希望Tcl有一天能成为最重要的整合平台。

原文作者:John K. Ousterhout

中文译者: sunny_ring

Tcl编程简介(二)

2006-09-20 19:36:0 列表

字符串的另一种解释为列表。一个列表是类似于结果的一个字符串包含了用空白分开的很多域。例

如 "Al Sue Anne John" 是一个有四个素的例表,在列表中换行父被视为分隔符。例如:

b c {d e {f g h}} 是一个有三个素的列表 b 、c 和 {d e {f g h}}。

Tcl的命令 concat, foreach, lappend, lindex, linsert,list, llength, lrange,lreplace, l s earch, 和 l s ort 可以使你对列表操作。

正则表达式

Tcl 提供了两个用于正则表达式的命令 regexp 和 regsub。这里的正则表导师实际上是扩展的正则表达式,

与 egrep 相一致。

支持 ^ $ . + ? > < () | []

命令结果

每一条命令有俩个结果:一个退出值和一个字符串。退出值标志着命令是否正确执行,字符串给出附加信息。有效的返回制定议在`tcl.h",如下:

TCL_OK

命令正确执行,字符串给出了命令的返回值。

TCL_ERROR

表示有一个错误发生,字符串给出了错误的描述。全局变量 errorInfo 包含了人类可读的错误描述,全局变量errorCode 机器使用的错误信息。

TCL_RE TURN

表示 return 命令被调用,当前的命令(通常是一个函数)必须立刻返回,字符串包含了返回值。

TCL_BRE AK

表示break已经被调用,最近的巡环必须立刻返回并跳出。字符串应该是空的。

TCL_CONTINUE

表示continue已经被调用,最近的巡环必须立刻返回不跳出。字符串应该是空的。

Tcl编程者一般需要关心退出值。当Tcl解释器发现错误发生后会立刻停止执行。

P rocedures 函数

Tcl 允许你通过proc命令来扩充命令(定义新的命令),定义之后可以向其它的内建命令一样使用。

例如:

proc pf {str} {

puts $str

}

pf "hello world"

这里有一个初学者不注意的地方,上述的定义一定要写成那样子。而不能向下面那样写:

proc pf {str}

{

puts $str

}

因为proc实际上也只不过是一条命令,是一换行符或分号来结束的,用集群参数来传递函数体。proc的定义如下:

proc name args tclcommand

Variables: scalars and arrays

变量:标量和向量(即数组)

向量就是数组,而标量是没有下表的变量。

我们用C来类比:

int i; // i 是标量

int j[10]; // j 是向量

变量不需要定义,使用的时候会自动的被创建。Tcl支持两种变量:标量和向量

举个例子来说明吧,

set i 100

set j(0) 10

set k(1,3) 20

i是标量,j是向量。

引用的时候:

$i

$j(0)

$k(1,3)

Tcl编程简介(三)

2006-09-20 19:38:0 Tcl 内置命令

内置的命令

Tcl提供了下面描述的内置函数。

.其中: ... 表示参数不定具体有:

append命令:

append varName value

append varName value value value ...

将那一大堆value附加到varName后面。如果变量不存在,会新建一个。

例子:

set i "aaa"

append i "bbb" "ccc"

正则表达式语言 - 快速参考

正则表达式语言?-?快速参考 正则表达式是正则表达式引擎尝试匹配输入文本的一种模式。?模式由一个或多个字符文本、运算符或构造组成。 字符转义 正则表达式中的反斜杠字符?(\)?指示其后跟的字符是特殊字符(如下表所示),或应按原义解释该字符。?有关更多信息,请参见正则表达式中的字符转义。

字符类 字符类与一组字符中的任何一个字符匹配。?字符类包括下表中列出的语言元素。?有关更多信息,请参见正则表达式中的字符类。

定位点 定位点或原子零宽度断言会使匹配成功或失败,具体取决于字符串中的当前位置,但它们不会使引擎在字符串中前进或使用字符。?下表中列出的元字符是定位点。?有关更多信息,请参见正则表达式中的定位点。 分组构造描述了正则表达式的子表达式,通常用于捕获输入字符串的子字符串。?分组构造包括下表中列出的语言元素。?有关更多信息,请参见正则表达式中的分组构造。

限定符 限定符指定在输入字符串中必须存在上一个元素(可以是字符、组或字符类)的多少个实例才能出现匹配项。?限定符包括下表中列出的语言元素。?有关更多信息,请参见正则表达式中的限定符。

反向引用构造 反向引用允许在同一正则表达式中随后标识以前匹配的子表达式。?下表列出了?.NET?Framework?的正则表达式支持的反向引用构造。?有关更多信息,请参见正则表达式中的反向引用构造。 替换构造用于修改正则表达式以启用?either/or?匹配。?这些构造包括下表中列出的语言元素。?有关更多信息,请参见正则表达式中的备用构造。

替换 替换是替换模式中支持的正则表达式语言元素。?有关更多信息,请参见正则表达式中的替代。?下表中列出的元字符是原子零宽度断言。 正则表达式选项 可以指定控制正则表达式引擎如何解释正则表达式模式的选项。?其中的许多选项可以指定为内联(在正则表达式模式中)或指定为一个或多个?RegexOptions?常量。?本快速参考仅列出内联选项。?有关内联和?RegexOptions?选项的更多信息,请参见文章正则表达式选项。 可通过两种方式指定内联选项: 通过使用杂项构造(?imn s x-imn s x),可以用选项或选项组前的减号?(-)?关闭这些选项。?例如,(?i-mn)?启用不区分大小写

常用正则表达式

1. 平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用: 2. "^\d+$"//非负整数(正整数+ 0) 3. "^[0-9]*[1-9][0-9]*$"//正整数 4. "^((-\d+)|(0+))$"//非正整数(负整数+ 0) 5. "^-[0-9]*[1-9][0-9]*$"//负整数 6. "^-?\d+$"//整数 7. "^\d+(\.\d+)?$"//非负浮点数(正浮点数+ 0) 8. "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"//正浮点数 9. "^((-\d+(\.\d+)?)|(0+(\.0+)?))$"//非正浮点数(负浮点数+ 0) 10. "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"//负浮点数 11. "^(-?\d+)(\.\d+)?$"//浮点数 12. "^[A-Za-z]+$"//由26个英文字母组成的字符串 13. "^[A-Z]+$"//由26个英文字母的大写组成的字符串 14. "^[a-z]+$"//由26个英文字母的小写组成的字符串 15. "^[A-Za-z0-9]+$"//由数字和26个英文字母组成的字符串 16. "^\w+$"//由数字、26个英文字母或者下划线组成的字符串 17. "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"//email地址 18. "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"//url 19. /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日 20. /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年 21. "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$" //Emil 22. /^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$/ //电话号码 23. "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}| 1dd|2[0-4]d|25[0-5])$" //IP地址 24. 25. 匹配中文字符的正则表达式:[\u4e00-\u9fa5] 26. 匹配双字节字符(包括汉字在内):[^\x00-\xff] 27. 匹配空行的正则表达式:\n[\s| ]*\r 28. 匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 29. 匹配首尾空格的正则表达式:(^\s*)|(\s*$) 30. 匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 31. 匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$ 32. 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 33. 匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})? 34. 匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$ 35. 36. 37. 元字符及其在正则表达式上下文中的行为:

Find用法详解(含正则表达式)

Sed基础用法篇 刚开始接触linux,其实还是老实用vim来编辑文件,不过同样的过程重复多次,你就要想办法简化你的过程。sed绝对是一个好的命令或者工具,你不需要用vim打开文件就可以直接编辑(推荐掌握以下用法)。 1、删除行首空格 sed 's/^[ ]*//g' filename sed 's/^ *//g' filename sed 's/^[[:space:]]*//g' filename 2、行后和行前添加新行 行后:sed 's/pattern/&\n/g' filename 行前:sed 's/pattern/\n&/g' filename &代表pattern 3、使用变量替换(使用双引号) sed ‐e "s/$var1/$var2/g" filename 4、在第一行前插入文本 sed ‐i '1 i\插入字符串' filename 5、在最后一行插入 sed ‐i '$ a\插入字符串' filename

6、在匹配行前插入 sed ‐i '/pattern/ i "插入字符串"' filename 7、在匹配行后插入 sed ‐i '/pattern/ a "插入字符串"' filename 8、删除文本中空行和空格组成的行以及#号注释的行 grep ‐v ^# filename | sed /^[[:space:]]*$/d | sed /^$/d 9、要将目录/modules下面所有文件中的zhangsan都修改成list,可用如下命令:(注意备份原文件) sed ‐i 's/zhangsan/list/g' `grep zhangsan ‐rl /modules` Linux命令FIND详解 由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权限。在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。 一、find 命令格式 1、find命令的一般形式为; find pathname ‐options [‐print ‐exec ‐ok ...]

正则表达式

要想真正的用好正则表达式,正确的理解元字符是最重要的事情。下表列出了所有的元字符和对它们的一个简短的描述。 字符描述 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“\n”匹配字符“n”。“\\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。 ^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。 $ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。 * 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。 + 匹配前面的子表达式一次或多次。例如,“z o+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。 ? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“d o”。?等价于{0,1}。 {n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。 {n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“fo o o ood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。 {n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。 ? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o?”将匹配单个“o”,而“o+”将匹配所有“o”。 点匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“[\s\S]”的模式。

正则表达式语法完整版

正则表达式基础知识 一个正则表达式就是由普通字符(例如字符a 到z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。如:

下面看几个例子: "^The":表示所有以"The"开始的字符串("There","The cat"等); "of despair$":表示所以以"of despair"结尾的字符串; "^abc$":表示开始和结尾都是"abc"的字符串——呵呵,只有"abc"自己了;"notice":表示任何包含"notice"的字符串。 '*','+'和'?'这三个符号,表示一个或一序列字符重复出现的次数。它们分别表示“没有或更多”,“一次或更多”还有“没有或一次”。下面是几个例子: "ab*":表示一个字符串有一个a后面跟着零个或若干个b。("a", "ab", "abbb",……);"ab+":表示一个字符串有一个a后面跟着至少一个b或者更多; "ab?":表示一个字符串有一个a后面跟着零个或者一个b; "a?b+$":表示在字符串的末尾有零个或一个a跟着一个或几个b。 也可以使用范围,用大括号括起,用以表示重复次数的范围。 "ab{2}":表示一个字符串有一个a跟着2个b("abb"); "ab{2,}":表示一个字符串有一个a跟着至少2个b; "ab{3,5}":表示一个字符串有一个a跟着3到5个b。

请注意,你必须指定范围的下限(如:"{0,2}"而不是"{,2}")。 还有,你可能注意到了,'*','+'和'?'相当于"{0,}","{1,}"和"{0,1}"。 还有一个'|',表示“或”操作: "hi|hello":表示一个字符串里有"hi"或者"hello"; "(b|cd)ef":表示"bef"或"cdef"; "(a|b)*c":表示一串"a""b"混合的字符串后面跟一个"c"; '.'可以替代任何字符: "a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字; "^.{3}$":表示有任意三个字符的字符串(长度为3个字符); 方括号表示某些字符允许在一个字符串中的某一特定位置出现: "[ab]":表示一个字符串有一个"a"或"b"(相当于"a|b"); "[a-d]":表示一个字符串包含小写的'a'到'd'中的一个(相当于"a|b|c|d"或者"[abcd]");"^[a-zA-Z]":表示一个以字母开头的字符串; "[0-9]%":表示一个百分号前有一位的数字; "[0-9]+":表示一个以上的数字; ",[a-zA-Z0-9]$":表示一个字符串以一个逗号后面跟着一个字母或数字结束。 你也可以在方括号里用'^'表示不希望出现的字符,'^'应在方括号里的第一位。(如:"%[^a-zA-Z]%"表 示两个百分号中不应该出现字母)。 为了逐字表达,必须在"^.$()|*+?{\"这些字符前加上转移字符'\'。 请注意在方括号中,不需要转义字符。

正则表达式经典教程

正则表达式是常见常忘,所以还是记下来比较保险,于是就有了这篇笔记。 希望对大家会有所帮助。J 1.什么是正则表达式 简单的说,正则表达式是一种可以用于文字模式匹配和替换的强有力的工具。是由一系列普通字符和特殊字符组成的能明确描述文本字符串的文字匹配模式。 正则表达式并非一门专用语言,但也可以看作是一种语言,它可以让用户通过使用一系列普通字符和特殊字符构建能明确描述文本字符串的匹配模式。除了简单描述这些模式之外,正则表达式解释引擎通常可用于遍历匹配,并使用模式作为分隔符来将字符串解析为子字符串,或以智能方式替换文本或重新设置文本格式。正则表达式为解决与文本处理有关的许多常见任务提供了有效而简捷的方式。 正则表达式具有两种标准: ·基本的正则表达式(BRE – Basic Regular Expressions) ·扩展的正则表达式(ERE – Extended Regular Expressions)。 ERE包括BRE功能和另外其它的概念。 正则表达式目前有两种解释引擎: ·基于字符驱动(text-directed engine) ·基于正则表达式驱动(regex-directed engine) Jeffery Friedl把它们称作DFA和NFA解释引擎。 约定: 为了描述起来方便,在本文中做一些约定: 1. 本文所举例的所有表达时都是基于NFA解释引擎的。 2. 正则表达式,也就是匹配模式,会简写为Regex。 3. Regex的匹配目标,也就是目标字符串,会简写为String。 4. 匹配结果用会用黄色底色标识。 5. 用1\+1=2 括起来的表示这是一个regex。 6. 举例会用以下格式: Regex Target String Description test This is a test 会匹配test,testcase等 2.正则表达式的起源正则表达式的?祖先?可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。 1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为?神经网事件的表示法?的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为?正则集的代数?的表达式,因此采用?正则表达式?这个术语。

QT正则表达式QRegExp的解析

QRegExp正则表达式 2010-03-20 17:00 "^\d+$" //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-\d+)|(0+))$" //非正整数(负整数 + 0) "^-[0-9]*[1-9][0-9]*$" //负整数 "^-?\d+$" //整数 "^\d+(\.\d+)?$" //非负浮点数(正浮点数 + 0) "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮点数 "^((-\d+(\.\d+)?)|(0+(\.0+)?))$" //非正浮点数(负浮点数 + 0) "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[ 1-9][0-9]*)))$" //负浮点数 "^(-?\d+)(\.\d+)?$" //浮点数 "^[A-Za-z]+$" //由26个英文字母组成的字符串 "^[A-Z]+$" //由26个英文字母的大写组成的字符串 "^[a-z]+$" //由26个英文字母的小写组成的字符串 "^[A-Za-z0-9]+$" //由数字和26个英文字母组成的字符串 "^\w+$" //由数字、26个英文字母或者下划线组成的字符串 "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$" //email地址 "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$" //url "^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$" // 年-月-日 "^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$" // 月/日/年 "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z ]{2,4}|[0-9]{1,3})(]?)$" //Email "(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?" //电话号码 "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1 dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$" //IP地址 ^([0-9A-F]{2})(-[0-9A-F]{2}){5}$ //MAC地址的正则表达式 ^[-+]?\d+(\.\d+)?$ //值类型正则表达式 QRegExp是Qt的正则表达式类. Qt中有两个不同类的正则表达式. 第一类为元字符.它表示一个或多个常量表达式. 令一类为转义字符,它代表一个特殊字符. 一.元字符 . 匹配任意单个字符.例如, 1.3 可能是1. 后面跟任意字符,再跟3 ^ 匹配字符串首. 例如, ^12可能是123,但不能是312

正则表达式

多少年来,许多的编程语言和工具都包含对正则表达式的支持,.NET基础类库中包含有一个名字空间和一系列可以充分发挥规则表达式威力的类,而且它们也都与未来的Perl 5中的规则表达式兼容。 此外,regexp类还能够完成一些其他的功能,例如从右至左的结合模式和表达式的编辑等。 在这篇文章中,我将简要地介绍System.Text.RegularExpression中的类和方法、一些字符串匹配和替换的例子以及组结构的详细情况,最后,还会介绍一些你可能会用到的常见的表达式。 应该掌握的基础知识 规则表达式的知识可能是不少编程人员“常学常忘”的知识之一。在这篇文章中,我们将假定你已经掌握了规则表达式的用法,尤其是Perl 5中表达式的用法。.NET的regexp类是Perl 5中表达式的一个超集,因此,从理论上说它将作为一个很好的起点。我们还假设你具有了C#的语法和.NET架构的基本知识。 如果你没有规则表达式方面的知识,我建议你从Perl 5的语法着手开始学习。在规则表达式方面的权威书籍是由杰弗里?弗雷德尔编写的《掌握表达式》一书,对于希望深刻理解表达式的读者,我们强烈建议阅读这本书。 RegularExpression组合体 regexp规则类包含在System.Text.RegularExpressions.dll文件中,在对应用软件进行编译时你必须引用这个文件,例如: csc r:System.Text.RegularExpressions.dll foo.cs 命令将创建foo.exe文件,它就引用了System.Text.RegularExpressions文件。 名字空间简介 在名字空间中仅仅包含着6个类和一个定义,它们是: Capture: 包含一次匹配的结果; CaptureCollection: Capture的序列; Group: 一次组记录的结果,由Capture继承而来; Match: 一次表达式的匹配结果,由Group继承而来; MatchCollection: Match的一个序列; MatchEvaluator: 执行替换操作时使用的代理; Regex: 编译后的表达式的实例。 Regex类中还包含一些静态的方法: Escape: 对字符串中的regex中的转义符进行转义; IsMatch: 如果表达式在字符串中匹配,该方法返回一个布尔值; Match: 返回Match的实例; Matches: 返回一系列的Match的方法; Replace: 用替换字符串替换匹配的表达式; Split: 返回一系列由表达式决定的字符串; Unescape:不对字符串中的转义字符转义。

《易语言“正则表达式”详细教程》

《易语言“正则表达式”教程》 本文改编自多个文档,因此如有雷同,不是巧合。 “正则表达式”的应用范围越来越广,有了这个强大的工具,我们可以做很多事情,如搜索一句话中某个特定的数据,屏蔽掉一些非法贴子的发言,网页中匹配特定数据,代码编辑框中字符的高亮等等,这都可以用正则表达式来完成。 本书分为四个部分。 第一部分介绍了易语言的正则表达式支持库,在这里,大家可以了解第一个正则表达式的易语言程序写法,以及一个通用的小工具的制作。 第二部分介绍了正则表达式的基本语法,大家可以用上述的小工具进行试验。 第三部分介绍了用易语言写的正则表达式工具的使用方法。这些工具是由易语言用户提供的,有的工具还带有易语言源码。他们是:monkeycz、零点飞越、寻梦。 第四部分介绍了正则表达式的高级技巧。 目录 《易语言“正则表达式”教程》 (1) 目录 (1) 第一章易语言正则表达式入门 (3) 一.与DOS下的通配符类似 (3) 二.初步了解正则表达式的规定 (3) 三.一个速查列表 (4) 四.正则表达式支持库的命令 (5) 4.1第1个正则表达式程序 (5) 4.2第2个正则表达式例程 (7) 4.3第3个例程 (8) 4.4一个小型的正则工具 (9) 第二章揭开正则表达式的神秘面纱 (11) 引言 (12) 一.正则表达式规则 (12) 1.1普通字符 (12) 1.2简单的转义字符 (13) 1.3能够与“多种字符”匹配的表达式 (14) 1.4自定义能够匹配“多种字符”的表达式 (16) 1.5修饰匹配次数的特殊符号 (17) 1.6其他一些代表抽象意义的特殊符号 (20) 二.正则表达式中的一些高级规则 (21) 2.1匹配次数中的贪婪与非贪婪 (21)

很完整的一篇正则表达式总结

1、正则表达式-完结篇---工具类开发--- ? 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 '/.+/', 'email'=> '/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/', 'url'=> '/^http(s?):\/\/(?:[A-za-z0-9-]+\.)+[A-za-z]{2,4}(?:[\/ \?#][\/=\?%\-&~`@[\]\':+!\.#\w]*)?$/', 'currency'=> '/^\d+(\.\d+)?$/', 'number'=> '/^\d+$/', 'zip'=> '/^\d{6}$/', 'integer'=> '/^[-\+]?\d+$/', 'double'=> '/^[-\+]?\d+(\.\d+)?$/',

5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2'english'=> '/^[A-Za-z]+$/', 'qq'=> '/^\d{5,11}$/', 'mobile'=> '/^1(3|4|5|7|8)\d{9}$/', ); //定义其他属性 private$returnMatchResult=false; //返回类型判断 private$fixMode=null; //修正模式 private$matches=array(); //存放匹配结果 private$isMatch=false; //构造函数,实例化后传入默认的两个参数 public function __construct($returnMatchResult=false,$fixMode=null){ $this->returnMatchResult=$returnMatchResult; $this->fixMode=$fixMode; } //判断返回结果类型,为匹配结果matches还是匹配成功与否isMatch,并调用返回方法 private function regex($pattern,$subject){ if(array_key_exists(strtolower($pattern), $this->validate)) $pattern=$this->validate[$pattern].$this->fixMode; //判断后再连接上修正模式作为匹配的正则表达式 $this->returnMatchResult ?

TCL+正则表达式参考

正则表达式参考 ——蒋小超 2007-07-23一、介绍 追根溯源,正则表达式是在1956年的时候,人类最早研究神经网络的产物,但随着时间的流逝,几乎所有编程语言都加入了对它的支持,hoho~其实这个东西也是程序员开发中比较有名的一个难点。但是不要以为它只能用于程序开发,在Unix/Linux系统管理中它也有极为广泛的应用。 不要认为正则表达式很可怕,用直白的话来说,正则表达式就是利用26个英文字符与一些特殊符号的配合来进行文字内容比对的方法,绝大部分情况下,26个英文字符都代表它们本身,但在特殊符号的辅助下,这些英文字符也会有其他的含义,正则表达式比较困难的地方,也就在这种字符的2义性上面,这篇文档中对于这种具有字符2义性的地方,都会有专门的标注和说明。 如果用过Dos/Windows/Linux中的通配符,就可以理解正则表达式的作用了,通配符用*号匹配任意多的任意字符,用?号匹配任意的一个字符,正则表达式有更加复杂的一套匹配系统,可以用来匹配几乎所有希望匹配的文字内容。

二、文档约定 本文档中的所有实例,都是在以下环境中调试和运行的: 操作系统: CentOS4.1(Linux 2.6.9-11) 编程语言: TCL8.4文本编辑器: VIM6.3.46文档格式约定:实例的解释性文字,使用华文楷体小四号蓝色字体显示 实例的解释性文字 系统或程序输出,使用浅蓝色底纹表示 特别需要注意和标注的地方,将以笑脸符号专门表示看我可爱吗? 系统或者程序输出

三、基本正则表达式 正则表达式中,26个英文字符代表它们本身,但是下面表格中的特殊字符则赋予了更多不同的含义,一定要记住它们,因为它们是一切正则表达式的基础 别看基本正则表达式就是这么9个符号,但是想完全理解和用好它们,还是很困难的,为了加深理解,我来详细的说明一下,这也是我自己学习时的理解和心得,请仔细的阅读。 要想完全明白这些符号的作用,必须多方位理解,我大概是根据符号所属的类型以及它们所起的作用这2个方向来理解它们的。

PYTHON正则表达式模块RE讲解

2re模块的基本函数 在上面的说明中,我们已经对re模块的基本函数‘findall’很熟悉了。当然如果光有findall 的话,很多功能是不能实现的。下面开始介绍一下re模块其它的常用基本函数。灵活搭配使用这些函数,才能充分发挥Python正则式的强大功能。 首先还是说下老熟人findall函数吧 findall(rule,target[,flag]) 在目标字符串中查找符合规则的字符串。 第一个参数是规则,第二个参数是目标字符串,后面还可以跟一个规则选项(选项功能将在compile函数的说明中详细说明)。 返回结果结果是一个列表,中间存放的是符合规则的字符串。如果没有符合规则的字符串被找到,就返回一个空列表。 2.1使用compile加速 compile(rule[,flag]) 将正则规则编译成一个Pattern对象,以供接下来使用。 第一个参数是规则式,第二个参数是规则选项。 返回一个Pattern对象 直接使用findall(rule,target)的方式来匹配字符串,一次两次没什么,如果是多次使用的话,由于正则引擎每次都要把规则解释一遍,而规则的解释又是相当费时间的,所以这样的效率就很低了。如果要多次使用同一规则来进行匹配的话,可以使用https://www.wendangku.net/doc/c717255873.html,pile函数来将规则预编译,使用编译过返回的Regular Expression Object或叫做Pattern对象来进行查找。 >>>s='111,222,aaa,bbb,ccc333,444ddd' >>>rule=r’\b\d+\b’ >>>compiled_rule=https://www.wendangku.net/doc/c717255873.html,pile(rule) >>>compiled_rule.findall(s) ['111','222'] 可见使用compile过的规则使用和未编译的使用很相似。compile函数还可以指定一些规则标志,来指定一些特殊选项。多个选项之间用’|’(位或)连接起来。 I IGNORECASE忽略大小写区别。 L LOCAL字符集本地化。这个功能是为了支持多语言版本的字符集使用环境的,比如在转义符\w,在英文环境下,它代表[a-zA-Z0-9],即所以英文字符和数字。如果在一个法语环境下使用,缺省设置下,不能匹配"é"或"?"。加上这L选项和就可以匹配了。不过这个对于中文环境似乎没有什么用,它仍然不能匹配中文字符。 M MULTILINE多行匹配。在这个模式下’^’(代表字符串开头)和’$’(代表字符串结尾)将能够匹配多行的情况,成为行首和行尾标记。比如 >>>s=’123456\n789012\n345678’ >>>rc=https://www.wendangku.net/doc/c717255873.html,pile(r’^\d+’)#匹配一个位于开头的数字,没有使用M选项 >>>rc.findall(s) ['123']#结果只能找到位于第一个行首的’123’ >>>rcm=https://www.wendangku.net/doc/c717255873.html,pile(r’^\d+’,re.M)#使用M选项 >>>rcm.findall(s) ['123','789','345']#找到了三个行首的数字

正则表达式7

Java正则表达式详解 仙人掌工作室 如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单。如果你不熟悉这个术语,那么“正则表达式”(Regular Expression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式。 许多语言,包括Perl、PHP、Python、JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级“搜索-替换”功能。那么Java又怎样呢?本文写作时,一个包含了用正则表达式进行文本处理的Java规范需求(Specification Request)已经得到认可,你可以期待在JDK的下一版本中看到它。 然而,如果现在就需要使用正则表达式,又该怎么办呢?你可以从https://www.wendangku.net/doc/c717255873.html,下载源代码开放的Jakarta-ORO库。本文接下来的内容先简要地介绍正则表达式的入门知识,然后以Jakarta-ORO API为例介绍如何使用正则表达式。 一、正则表达式基础知识 我们先从简单的开始。假设你要搜索一个包含字符“cat”的字符串,搜索用的正则表达式就是“cat”。如果搜索对大小写不敏感,单词“catalog”、“Catherine”、“sophisticated”都可以匹配。也就是说: 1.1句点符号 假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以“n”字母结束。另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容。要构造出这个正则表达式,你可以使用一个通配符——句点符号“.”。这样,完整的表达式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,还匹配“t#n”、“tpn”甚至“t n”,还有其他许多无意义的组合。这是因为句点符号匹配所有字符,包括空格、Tab字符甚至换行符: 1.2方括号符号 为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号(“[]”)里面指定看来有意义的字符。此时,只有方括号里面指定的字符才参与匹配。也就是说,正则表达式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因为在方括号之内你只能匹配单个字符 1.3“或”符号

正则表达式

正则表达式
目录
1. 引言 2. 基本语法 3. sed 4. awk 5. 练习:在 C 语言中使用正则表达式
1. 引言
以前我们用 grep 在一个文件中找出包含某些字符串的行,比如在头文件中找出一个宏定义. 其实 grep 还可以找出符合某个模式(Pattern)的一类字符串.例如找出所有符合 xxxxx@xxxx.xxx 模式的字符串(也就是 email 地址),要求 x 字符可以是字母,数字,下划 线,小数点或减号,email 地址的每一部分可以有一个或多个 x 字符,例如 abc.d@https://www.wendangku.net/doc/c717255873.html,, 1_2@987-6.54,当然符合这个模式的不全是合法的 email 地址,但至少可以做一次初步筛选, 筛掉 a.b,c@d 等肯定不是 email 地址的字符串.再比如,找出所有符合 yyy.yyy.yyy.yyy 模 式的字符串(也就是 IP 地址),要求 y 是 0-9 的数字,IP 地址的每一部分可以有 1-3 个 y 字 符. 如果要用 grep 查找一个模式,如何表示这个模式,这一类字符串,而不是一个特定的字符串 呢?从这两个简单的例子可以看出,要表示一个模式至少应该包含以下信息: 字符类(Character Class):如上例的 x 和 y,它们在模式中表示一个字符,但是取 值范围是一类字符中的任意一个. 数量限定符(Quantifier): 邮件地址的每一部分可以有一个或多个 x 字符,IP 地址 的每一部分可以有 1-3 个 y 字符 各种字符类以及普通字符之间的位置关系:例如邮件地址分三部分,用普通字符@和. 隔开,IP 地址分四部分,用.隔开,每一部分都可以用字符类和数量限定符描述.为 了表示位置关系,还有位置限定符(Anchor)的概念,将在下面介绍.
规定一些特殊语法表示字符类,数量限定符和位置关系,然后用这些特殊语法和普通字符一 起表示一个模式,这就是正则表达式(Regular Expression).例如 email 地址的正则表达式 可以写成[a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+\.[a-zA-Z0-9_.-]+,IP 地址的正则表达式可以 写成[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.下一节介绍正则表达式的语法, 我们先看看正则表达式在 grep 中怎么用.例如有这样一个文本文件 testfile:
192.168.1.1
第 1 页 共 10 页

Java中的正则表达式+--++示例详解

Java中的正则表达式 众所周知,在程序开发中,难免会遇到需要匹配、查找、替换、判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力。因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段。 大家都知道,正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 自从jdk1.4推出java.util.regex包,就为我们提供了很好的JAVA正则表达式应用平台。 因为正则表达式是一个很庞杂的体系,所以我仅例举些入门的概念,更多的请参阅相关书籍及自行摸索。 \\ 反斜杠 \t 间隔 ('\u0009') \n 换行 ('\u000A') \r 回车 ('\u000D') \d 数字等价于[0-9] \D 非数字等价于[^0-9] \s 空白符号 [\t\n\x0B\f\r] \S 非空白符号 [^\t\n\x0B\f\r] \w 单独字符 [a-zA-Z_0-9] \W 非单独字符 [^a-zA-Z_0-9] \f 换页符 \e Escape \b 一个单词的边界 \B 一个非单词的边界 \G 前一个匹配的结束 ^为限制开头 ^java 条件限制为以Java为开头字符 $为限制结尾 java$ 条件限制为以java为结尾字符 .为限制一个任意字符 java.. 条件限制为java后除换行外任意两个字符 加入特定限制条件「[]」 [a-z] 条件限制在小写a to z范围中一个字符 [A-Z] 条件限制在大写A to Z范围中一个字符 [a-zA-Z] 条件限制在小写a to z或大写A to Z范围中一个字符 [0-9] 条件限制在小写0 to 9范围中一个字符

C#正则表达式之Regex类用法详解

C#正则表达式之Regex类用法详解 正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串,正则表达式无疑是处理文本最有力的工具,而.NET提供的Regex类实现了验证正则表达式的方法。 Regex类表示不可变(只读)的正则表达式。它还包含各种静态方法,允许在不显式创建其他类的实例的情况下使用其他正则表达式类。 正则表达式基础概述 什么是正则表达式 在编写字符串的处理程序时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。 通常,我们在使用WINDOWS查找文件时,会使用通配符(*和?)。如果你想查找某个目录下的所有Word文档时,你就可以使用*.doc进行查找,在这里,*就被解释为任意字符串。和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求——当然,代价就是更复杂。 一、C#正则表达式符号模式

说明: 由于在正则表达式中“\”、“?”、“*”、“^”、“$”、“+”、“(”、“)”、“|”、“{”、“[”等字符已经具有一定特殊意义,如果需要用它们的原始意义,则应该对它进行转义,例如希望在字符串中至少有一个“\”,那么正则表达式应该这么写:\\+。

二、在C#中,要使用正则表达式类,请在源文件开头处添加以下语句: 复制代码代码如下: using Syst https://www.wendangku.net/doc/c717255873.html, ressions; 三、RegEx类常用的方法 1、静态Match方法 使用静态Match方法,可以得到源中第一个匹配模式的连续子串。 静态的Match方法有2个重载,分别是 Regex.Match(string input,string pattern); Regex.Match(string input,string pattern,RegexOptions options); 第一种重载的参数表示:输入、模式 第二种重载的参数表示:输入、模式、RegexOptions枚举的“按位或”组合。 RegexOptions枚举的有效值是: Complied表示编译此模式 CultureInvariant表示不考虑文化背景 ECMAScript表示符合ECMAScript,这个值只能和IgnoreCase、Multiline、Complied连用ExplicitCapture表示只保存显式命名的组 IgnoreCase表示不区分输入的大小写 Ign https://www.wendangku.net/doc/c717255873.html, pace表示去掉模式中的非转义空白,并启用由#标记的注释Multiline表示多行模式,改变元字符^和$的含义,它们可以匹配行的开头和结尾 None表示无设置,此枚举项没有意义 RightToLeft表示从右向左扫描、匹配,这时,静态的Match方法返回从右向左的第一个匹配Singleline表示单行模式,改变元字符.的意义,它可以匹配换行符

Perl+正则表达式讲解

Perl正则表达式讲解 摘自《Perl编程详解》目录:

9.3.1原则1 正则表达式有三种形式:匹配、替换和转换。 在表 9-1 中列有三种正则表达式运算符。 接下来对每一个表达式给出详尽解释。 匹配:m//这种形式表明在//内部的正则表达将用于匹配 = ~或 !~左边的标量。为了语法上的简化用//,略去m 。 替换:s///这种形式表明正则表达式将被文本替换,为了语法的简化用//略去s 。 ·转换:tr///这种 形式包含一系列的字符—/—同时把它们替 换为。 注意转换并不真正是一个正则表达式,但是对于 用正则表达式难于处理的数据常使用它来进行操纵。因 此,tr/[0-9]/9876543210.组成1223456789,987654321 等字符串。 通过使用=~(用英语讲:does ,与“进行匹配”同) 和!~(英语:doesn't ,与“不匹配”同)把这些表达式捆绑 到标量上。作为这种类型的例子,下面我们给出六个示例 正则表达式及相应的定义: $scalar $scalarName =~ s/a/b;Name =~ s/a/b;Name =~ s/a/b; # substitute the character a for b, and return true if this can happern # substitute the character a for b, and return true if this can happern $scalarName =~ m/a;$scalarName =~ m/a; # does the scalar $scalarName have an a in it? # does the scalar $scalarName have an a in it? ~ tr/A $scalarName =~ tr/A--Z/a Z/a--# translate all capital letter with lower case ones, and retur z/; # translate all capital letter with lower case ones, and return ture n ture if this happens if this happens $scalarName !~ s/a/b/;$scalarName !~ s/a/b/; # substitute the character a for b, and return false if this indeed happens.happens. $scalarName !~ m/a/;$scalarName !~ m/a/; # does the scalar $scalarName match the character a? Return false if it does.if it does. $scalarName !~ tr/0$scalarName !~ tr/0--9/a 9/a--j/;j/; # translate the digits for the letters a thru j, and return false if this happens.if this happens. 如果我们输入像 horned toad =~ m/toad/ 这样的代码,则出现图 9-1 所示情况: 另外,如果读者正在对特定变量 $_ 进行匹配(读者可能在while 循环,map 或grep 中使用),则可以不用!~和=~。因而,以下所有代码都会合法: my @elemente = (' al' ,' a2' ,my @elemente = (' al' ,' a2' ,' a3' ,' a4' ,' a5' );' a3' ,' a4' ,' a5' );' a3' ,' a4' ,' a5' ); foreach (@elements) {s/a/b/;}foreach (@elements) {s/a/b/;} 程序使 @elements 等于b 1,b2.b3,b4,b5。另外: while(<$FD>) {print if (m/ERBOR/);} while(<$FD>) {print if (m/ERBOR/);}