在不带{}的regexp上匹配[0-9]

在不带{}的regexp上匹配[0-9],regex,tcl,Regex,Tcl,因为我被要求匹配字符串“[0-9]”(请注意,我不是要匹配数字0到9) 我曾经 这很好,但无论如何,在一次采访中,我被要求不要用{}来封装模式,而是用“”或其他东西来替代 regexp "\[0-9\]" $a out 但奇怪的是,当我使用“”时,我只能匹配0 不管怎样,在regexp中没有{}就可以完成吗?我不知道为什么需要使用regexp。您可以使用字符串方法,例如使用全局匹配的stringmatch: string match {*[0-9]*} $a *将匹配任何内容,它是全局匹配

因为我被要求匹配字符串“[0-9]”(请注意,我不是要匹配数字0到9) 我曾经

这很好,但无论如何,在一次采访中,我被要求不要用{}来封装模式,而是用“”或其他东西来替代

regexp  "\[0-9\]" $a out
但奇怪的是,当我使用“”时,我只能匹配0


不管怎样,在regexp中没有{}就可以完成吗?我不知道为什么需要使用
regexp
。您可以使用字符串方法,例如使用全局匹配的
stringmatch

string match {*[0-9]*} $a
*
将匹配任何内容,它是全局匹配中的通配符

或者您可以使用
string first
expr
,如果返回的索引大于-1(即
[0-9]
在字符串
$a
中),则基本上返回1,否则返回0(即
[0-9]
在字符串
$a
中不存在
[0-9]
):

无论如何,如果你真的想要一个正则表达式,你需要做一些转义:

regexp {\[0-9\]} $a out
请注意,您不需要使用
$out
,因为您正在寻找无法更改的内容的精确匹配,因此您最好使用
regexp{\[0-9\]}$a

或者使用告诉
regexp
从字面上处理字符串的语法:

regexp {***=[0-9]} $a

其中,
***=
(?q)
告诉
regexp
将以下字符视为文字字符

您可以了解有关re语法的更多信息


但奇怪的是,当我使用“”时,我只能匹配0


这是因为传递给
regexp
引擎的是
[0-9]
。这是因为在将表达式传递给
regexp
之前,将替换
\[
\]
。因此,您实际上正在传递表达式
[0-9]
,它将匹配任何一个数字。

我不确定您为什么需要使用
regexp
来实现这一点。您可以使用字符串方法,例如使用全局匹配的
stringmatch

string match {*[0-9]*} $a
*
将匹配任何内容,它是全局匹配中的通配符

或者您可以使用
string first
expr
,如果返回的索引大于-1(即
[0-9]
在字符串
$a
中),则基本上返回1,否则返回0(即
[0-9]
在字符串
$a
中不存在
[0-9]
):

无论如何,如果你真的想要一个正则表达式,你需要做一些转义:

regexp {\[0-9\]} $a out
请注意,您不需要使用
$out
,因为您正在寻找无法更改的内容的精确匹配,因此您最好使用
regexp{\[0-9\]}$a

或者使用告诉
regexp
从字面上处理字符串的语法:

regexp {***=[0-9]} $a

其中,
***=
(?q)
告诉
regexp
将以下字符视为文字字符

您可以了解有关re语法的更多信息


但奇怪的是,当我使用“”时,我只能匹配0


这是因为传递给
regexp
引擎的是
[0-9]
。这是因为在将表达式传递给
regexp
之前,将替换
\[
\]
。因此,您实际上正在传递表达式
[0-9]
,它将匹配任何一个数字。

在Tcl中,
{
..
}
只是一种引用机制。你永远不需要它,但是如果没有它,写代码会很烦人。让我们不加任何引号地写:

regexp \\\[0-9\\\] $a out
请注意,这里有三个反斜杠,因为我们需要一个反斜杠用于重新引擎(防止
[
成为字符集),另一个反斜杠用于
\[
的每个字符(阻止Tcl基本语法引擎解释内容)。我们可以在它周围加上双引号;它们真正做的就是阻止基本语法引擎检测单词的结尾,直到它到达双引号的匹配结尾,但我们在re中根本不使用任何空格,所以这不重要。通常,在人们认为是High L字符串的东西周围加上双引号照明的目的,但Tcl并不是这样工作的

事实上,Tcl声名远扬的主要原因之一就是它真正拥有的特殊语法形式非常少,并且它如何将它们一致地应用于所有事情。例如,我们可以完全不用大括号编写过程:

proc foo "a b" "
    for set\\ i\\ \\\$a \\\$i\\ <\\ \\\$b incr\\ i puts\\ \\\$i...
"
proc foo“a b”

对于Tcl中的set\\i\\\\\\\$a\\\\$i\\\,
{
..
}
只是一种引用机制。您永远不需要它,但如果没有它,编写代码会非常烦人。让我们完全不使用任何引号来编写代码:

regexp \\\[0-9\\\] $a out
请注意,这里有三个反斜杠,因为我们需要一个反斜杠用于重新引擎(防止
[
成为字符集),另一个反斜杠用于
\[
的每个字符(阻止Tcl基本语法引擎解释内容)。我们可以在它周围加上双引号;它们真正做的就是阻止基本语法引擎检测单词的结尾,直到它到达双引号的匹配结尾,但我们在re中根本不使用任何空格,所以这不重要。通常,在人们认为是High L字符串的东西周围加上双引号照明的目的,但Tcl并不是这样工作的

事实上,Tcl声名远扬的主要原因之一就是它真正拥有的特殊语法形式非常少,并且它如何将它们一致地应用于所有事情。例如,我们可以完全不用大括号编写过程:

proc foo "a b" "
    for set\\ i\\ \\\$a \\\$i\\ <\\ \\\$b incr\\ i puts\\ \\\$i...
"
proc foo“a b”

对于set\\i\\\\\\\$a\\\\\$i\\Btw,如果你被告知不应该使用
{}
,那是相当残忍的,因为使用
”,你将不得不使用三个反斜杠:
regexp“\\\\[0-9\\\]”“$a
前两个将产生一个文字反斜杠,第二个将产生一个文字
[
,然后通过
\[0-9\]