Tcl/Tk Insight: 正则表达式

风行水上 @ 2009-07-03 18:37:26
标签:
    «目录»

    正则表达式的产生主要是为了字符串的处理。面读一个字符串时,我们感兴趣的信息往往包含在某个关键词上,为了找到这个关键词,程序的做法就是对字符串进行匹配。
    正则表达是可以大大简化这种匹配过程。

    匹配字符 描述.
    . 点用来匹配任何字符
    ^ 一行的开头
    $ 一行的结束
    * 星号用来匹配任意数目的字符
    + 加号用来匹配至少一个字符
    ? 问号用来匹配至多一个字符
    {2,4} 大括号可以用来更精确地限定字符的数目

    常用的正则表达式举例

    正则表达式 描述
    [0-9]+ 匹配正整数
    [-+]?[0-9]+(\.[0-9]+)? 匹配数值,包括小数
    [a-zA-Z_0-9]+ 由字母、数字、下划线组成的单词
    ^Error 以字符串"Error"开始的行
    ^[ \t]*$ 或者 ^\s*$ 匹配空行
    • 在Tcl命令中,最好把正则表达式写在大括号中,这样有利于避免字符转义

    Tcl 中常用的命令有

    regexp

    • regexp 用来对字符串进行匹配。不仅可以用来测试是复匹配,还可以提取匹配的字符。
    • regexp 的返回值表示匹配是否成功
    • 忽略大小写可以用 "-nocase" 选项
    set str "This is a cat"
    set rv [regexp {is a ([a-z]+)} $str str_match str_1
    puts $rv          ; # rv        = 1
    # 匹配到的字符串
    puts $str_match   ; # str_match = is a cat
    # 正则表达式中括号部分对应的字符串
    puts $str_1       ; # str_1     = cat
    
    • 将匹配结果作为List返回。"-inline" 选项的作用。
    set rv [regexp -inline {is a ([a-z]+)} $str ]
    puts $rv ; # rv = {{is a cat} {cat}}
    

    regsub

    • regsub 利用正则表达式对字符串进行替换操作
    • 忽略大小写可以用 "-nocase" 选项
    • 全部替换可以用 "-all" 选项
    set str "This is a cat, another cat"
    # 返回值是替换后的字符串
    set str_2 [regsub {cat} $str dog]
    # 也可以直接赋值给新的变量
    regsub {cat} $str dog str_3
    puts $str_2  ; # str_2 = This is a dog, another cat
    puts $str_3  ; # str_3 = This is a dog, another cat
    
    # 默认 regsub 只替换第一个遇到的匹配
    # 替换所有的匹配可以使用 -all
    regsub -all {cat} $str dog $str_4
    puts $str_4  ; # str_3 = This is a dog, another dog
    
    标签:

      分享到:
      comments powered by Disqus

      46/55ms