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
答案 0 :(得分:3)
您的角色类中有错误。
[1-10]
并不代表1到10之间的数字1-1
,这是一个从1
到1
(即只是1
)或0
的字符。这解释了你的输出。(?: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}}或*
)它们在正则表达式中的行为方式不受全局匹配支持。
最后一件事,使用大括号来避免转义你的模式(除非你的模式中有变量或运行函数,否则不能这样做。)