在没有{}的正则表达式上匹配[0-9]

时间:2014-04-29 15:30:44

标签: regex tcl

当我被要求匹配字符串" [0-9]" (请注意我不是要匹配0到9号) 我用了

set a {[0-9]}
regexp  {\[0-9\]} $a out

完美无缺。但是无论如何在一次采访中,我被要求不使用{}来封闭模式,而是用#34;"或其他什么

regexp  "\[0-9\]" $a out

但奇怪的是,当我使用""我只能匹配0

无论如何可以在regexp

中没有{}的情况下完成

2 个答案:

答案 0 :(得分:2)

我不确定为什么你需要使用regexp来做到这一点。您可以使用字符串方法,例如使用glob匹配的string match

string match {*[0-9]*} $a

*将匹配任何内容,它是全局匹配中的通配符。

或者您可以将string firstexpr一起使用,如果返回的索引高于-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...}
}

但哪个更清楚呢?写的比较容易?我认为答案是不言而喻的!知道你永远不需要使用大括号,但为了善良,请在现实中使用大括号!