Tcl正则表达式

时间:2014-06-20 11:01:46

标签: regex tcl

set d(aa1) 1 
set d(aa2) 1                                                                                                                   
set d(aa3) 1
set d(aa4) 1
set d(aa5) 1
set d(aa6) 1
set d(aa7) 1
set d(aa8) 1
set d(aa9) 1
set d(aa10) 1
set d(aa11) 1
set regexp "a*\[1-9\]"
set res [array names d -glob $regexp]
puts "res = $res"

在这种情况下,结果是:

res = aa11 aa6 aa2 aa7 aa3 aa8 aa4 aa9 aa5 aa1

但是,当我将正则表达式从a*\[1-9\]更改为a*\[1-10\]时,结果将变为:

res = aa11 aa10 aa1

2 个答案:

答案 0 :(得分:3)

您的角色类中有错误。

  • [1-10]并不代表1到10之间的数字
  • 这意味着1-1,这是一个从11(即只是1)或0的字符。这解释了你的输出。
  • 表示从1到10的数字,请使用:(?:10?|[2-9])(作为几种方法之一。
  • 因此你的正则表达式变为a*(?:10?|[2-9])
  • 请注意,如果您的引擎不允许非捕获组,则需要删除?:,用于:a*(?:10?|[2-9])

答案 1 :(得分:3)

您需要确定自己要匹配的内容,因为glob样式匹配和regexp样式匹配在许多方面都有所不同。

the docs起,glob有以下内容:

  • *匹配字符串中的任何字符序列,包括空字符串。
  • ?匹配字符串中的任何单个字符。
  • [chars]匹配chars给出的集合中的任何字符。如果x-y形式的序列出现在字符中,那么x和y之间的任何字符都将匹配。与-nocase一起使用时,范围的终点将首先转换为小写。鉴于{[A-z]}匹配区分大小写时_匹配(_Z之间的a),-nocase{[A-Za-z]}匹配\x(可能首先意味着什么)。
  • x匹配单个字符*?[]\。这提供了一种避免对模式中的字符a*\[1-9\]进行特殊解释的方法。

由于您正在使用glob样式匹配,因此当前表达式(a)与abcjdne1匹配,后跟任何字符以及1到9中的任何一个(意味着它)也会匹配像a)这样的东西。

如果您想匹配至少一个-regexp后跟1到10之间的数字,则需要使用set regexp {a+(?:[1-9]|10)} set res [array names d -regexp $regexp] 模式:

(?:[1-9]|10)

现在,这个正则表达式是我认为对于初学者来说更自然((?:10?|[2-9])意味着1到9或10,但你可以使用zx81建议的形式+意思是1,可选0为10,或2到9)。

a表示^a+(?:[1-9]|10)$ 必须至少出现一次,才能匹配数组名称。

如果您现在需要匹配全名,则需要使用锚点:

a

注意:如果要匹配至少一个|后跟数字,并且交替(使用管道?)和量词(+或{{ 1}}或*)它们在正则表达式中的行为方式不受全局匹配支持。

最后一件事,使用大括号来避免转义你的模式(除非你的模式中有变量或运行函数,否则不能这样做。)