在不带{}的regexp上匹配[0-9]
因为我被要求匹配字符串“[0-9]”(请注意,我不是要匹配数字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 *将匹配任何内容,它是全局匹配
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\]