当我被要求匹配字符串" [0-9]" (请注意我不是要匹配0到9号) 我用了
set a {[0-9]}
regexp {\[0-9\]} $a out
完美无缺。但是无论如何在一次采访中,我被要求不使用{}来封闭模式,而是用#34;"或其他什么
regexp "\[0-9\]" $a out
但奇怪的是,当我使用""我只能匹配0
无论如何可以在regexp
中没有{}的情况下完成答案 0 :(得分:2)
我不确定为什么你需要使用regexp
来做到这一点。您可以使用字符串方法,例如使用glob匹配的string match
:
string match {*[0-9]*} $a
*
将匹配任何内容,它是全局匹配中的通配符。
或者您可以将string first
与expr
一起使用,如果返回的索引高于-1(即[0-9]
在字符串$a
中),则基本上返回1)否则为0(即字符串[0-9]
中没有$a
):
expr {[string index {[0-9]} $a] > -1}
无论如何,如果你真的想要一个正则表达式,你将有一些逃避:
regexp {\[0-9\]} $a out
请注意,您不需要$out
,因为您正在寻找无法更改的内容的完全匹配,因此您也可以使用regexp {\[0-9\]} $a
或者使用一种语法告诉regexp
按字面意思处理字符串:
regexp {***=[0-9]} $a
或
regexp {(?q)[0-9]} $a
***=
和(?q)
告诉regexp
将以下字符视为字面字符。
您可以详细了解re语法on this man page。
但奇怪的是,当我使用“”时,我只能匹配0
那是因为你传递给regexp
引擎的是[0-9]
。这是因为在将表达式传递给\[
之前,\]
和regexp
已被替换。所以你实际上已经传递了表达式[0-9]
,它将匹配任何一个数字。
答案 1 :(得分:2)
在Tcl中,{
... }
只是一种引用机制。你永远不需要它,但如果没有它,编写代码真的很烦人。让我们写一下没有任何引号:
regexp \\\[0-9\\\] $a out
请注意,我们在那里有三个反斜杠,因为我们想要一个RE引擎的反斜杠(这会阻止[
成为一个字符集)和\[
的每个字符的一个反斜杠(它阻止Tcl基本语法引擎解释事物)。我们可以在它周围加上双引号;所有他们真正做的就是停止基本语法引擎检测到单词的结尾,直到它达到双引号的匹配关闭,但我们在RE中根本没有使用任何空格,所以无关紧要。将双引号放在人们认为用于突出显示目的的字符串上是常规的,但是Tcl并没有真正起作用。
事实上,Tcl声名鹊起的主要原因之一就是它真正具有多少特殊的语法形式,以及它如何将它们始终如一地应用于所有事物。例如,我们可以完全编写程序而不使用大括号:
proc foo "a b" "
for set\\ i\\ \\\$a \\\$i\\ <\\ \\\$b incr\\ i puts\\ \\\$i...
"
这个代码运行得很好;它在功能上与:
相同proc foo {a b} {
for {set i $a} {$i < $b} {incr i} {puts $i...}
}
但哪个更清楚呢?写的比较容易?我认为答案是不言而喻的!知道你永远不需要使用大括号,但为了善良,请在现实中使用大括号!