总有别人不曾走过的路,总有别人不曾目睹的风景......

Tcl读书笔记(六)——正则表达式

上一篇 / 下一篇  2012-07-20 10:48:40 / 个人分类:Tcl

1. 使用正则表达式进行模式匹配:
   Tcl支持三类正则表达式,分别称为基本正则表达式(BRE)、扩展正则表达式(ERE)、高级正则表达式(ARE)。自8.1版本开始

Tcl命令都默认支持ARE。
   1.1 正则表达式的原子:
      原子是正则表达式的基本单位。
      ^abc与任意以abc开头的字符串匹配。abc$与任意以abc结尾的字符串匹配。^abc$只与字符串abc匹配。
      \mabc与任意以abc开头的单词匹配。abc\M与任意以abc结尾的单词匹配。\mabc\M只与单词abc匹配。
      原子.与任意单个字符匹配。而原子\x中x可以是任意一个字符,与x匹配。如.\$与任意包含一个$符号,且该$符号不是第一个

字符的字符串匹配。而\.$与任意以句点结尾的字符串匹配。
      除此之外,Tcl还有两种类型的原子。第一类由圆括号中的正则表达式组成,如(a.b)。圆括号用于分组,一对圆括号中的正则

表达式常被称为子表达式或子模式。原子还有一种类型,范围。即方括号中的字符之间的内容的集合。范围与方括号中的任意一个字

符匹配。而且,如果范围中有a-b这种形式的序列,那么所有ASCII码在a和b之间的字符都在这个集合当中。因此,正则表达式[0-9a

-fA-f]与任意含有十六进制数的字符串匹配。 
      在方括号表示的范围中,还可以使用”字符类型”来代表一种类型的全部字符。如[:alpha:]的范围就是全部的字母。此处所指

的全部的字母不只是ASCII字母[a-zA-Z],还包括了所有的Unicode字母字符。
   1.2 正则表达式的分支和量词:
      正则表达式可以用操作符|连接。可与|边接的某个正则表达式匹配的字符串,则可与所得的正则表达式匹配。用|连接起来的

那些正则表达式称为分支。如果两个或多个分支都可以匹配,那么Tcl会选择最长的进行匹配。可以用圆括号把分支括起来,避免分

支变得太长。
      操作符*、+、?被称为量词,可以跟在原子后面,用来指定它的重复次数。
      一个后面跟着*的原子与由零个或多个该原子组成的序列匹配。
      一个后面跟着+的原子与由一个或多个该原子组成的序列匹配。
      一个后面跟着?的原子与空字符串或与这个原子匹配的字符串匹配。
      另一组量词,被称为边界,用于确切指定在匹配时原子应该重复出现几次。
      正则表达式的量词设置为贪婪,即与尽可能多的字符进行匹配。任意量词都可以在后面跟一个?,将其设置为非贪婪,从而与

尽可能短的子字符串进行匹配。因此,+和{3,7}是贪婪量词,而+?和{3,7}?是非贪婪量词。
   1.3 逆向引用:
      在一个正则表达式中,逆向引用匹配与前面一个子表达式相同的字符集。逆向引用的语法是在\后面跟一个前面的子表达式的

编号。子表达式依据它们的左括号进行编号。
   1.4 非捕获子表达式:
      其格式为(?:experssion)。其优点是处理速度更快。缺点是不能逆向引用非捕获子表达式,与非捕获子表达式匹配的子字符串

也不能作为独立的匹配变量取出。
   1.5 regexp命令:
      regexp调用正则表达式匹配。其最简单形式要获取两个参数:正则表达式模式和输入字符串。返回0或1,代表输入字符串能否

匹配模式。正则表达模式被括在大括号中,使得字符$、[以及]被传给命令regexp,而不会触发变量替换和命令替换。故建议总是把

正则表达式括在大括号中。
      如果regexp在输入字符串后还调用更多的参数,每一个参数都被作为一个变量名对待。第一个变量会存入与整个正则表达式匹

配的子字符串。第二个变量会存入与捕获到的第一个子表达式相匹配的子字符串;第三个变量会存入与捕获到的下一个子表达式相匹

配的子字符串。以此类推。如果变量名的数量比捕获到的子表达式数量更多,多余的变量会被设置为空字符串。
      -start:在后面跟一个字符串中的字符索引,指定regexp从该位置开始查找匹配。
      -all:使regexp在字符串中查找尽量多次的匹配,并返回总的匹配次数。
      -nocase:指定了模式中的字母在字符串中查找匹配时不区分大小写。
      -indices:指明额外的变量不应该用于存放匹配的子字符串的值,而是存放给出子字符串范围的首字符和尾字符的索引列表。
      -inline:让regexp把匹配变量返回为一个数据表。
      -line:激活分区换行的匹配。指定这个选项后,[^括号表达式和.绝不会与新行匹配,^原子除了它的普通功能外,与新行后

的空字符串匹配,$原子除了它的普通功能外,与新行前的空字符串匹配。
      regexp命令也支持用--选项明确地标志选项结束。在实际工作中建议总是使用--选项;否则如果您的模式以-字符开头,它可

能被错误地解析为另一个选项。
   1.6 使用正则表达式进行替换:
      使用regsub命令,正则表达式也可以用于替换。第一个参数是正则表达式模式,第二个参数是输入字符串。第三个参数是替换

字符串,第四个参数为存放新的字符串的变量名。返回1代表字符串与模式匹配,返回0代表不匹配。

TAG: TCL tcl Tcl

 

评分:0

我来说两句

phoenix_lo

phoenix_lo

用户虐我千百遍,我待用户如初恋。

日历

« 2024-05-01  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 43794
  • 日志数: 23
  • 建立时间: 2011-06-12
  • 更新时间: 2012-10-30

RSS订阅

Open Toolbar