TCL:\。没有按预期工作

TCL:\。没有按预期工作,tcl,Tcl,我有下面的代码 set src "/tmp/16.10c.00.01/run.c" regsub "\.c" $src ".o" obj puts "$obj" 它正在打印/tmp/16.1.o.00.01/run.c作为输出。 其中,预期输出为/tmp/16.10c.00.01/run.o。 如果我将其保留为“\.c$”,它将按预期工作。 第一个代码中有什么错误 错误在于传递给解释器的原始正则表达式是: .c 正则表达式中的上述字符表示后跟c的任何字符 你需要做的是使用两个反斜杠,第一个用

我有下面的代码

set src "/tmp/16.10c.00.01/run.c"
regsub "\.c" $src ".o" obj
puts "$obj"
它正在打印
/tmp/16.1.o.00.01/run.c
作为输出。 其中,预期输出为
/tmp/16.10c.00.01/run.o
。 如果我将其保留为
“\.c$”
,它将按预期工作。
第一个代码中有什么错误

错误在于传递给解释器的原始正则表达式是:

.c
正则表达式中的上述字符表示后跟
c
的任何字符

你需要做的是使用两个反斜杠,第一个用来避开第二个反斜杠。或使用大括号进行报价(防止第一次替换):


错误在于,传递给解释器的原始正则表达式是:

.c
正则表达式中的上述字符表示后跟
c
的任何字符

你需要做的是使用两个反斜杠,第一个用来避开第二个反斜杠。或使用大括号进行报价(防止第一次替换):


“.c”与正则表达式中的“\.c”@Rupesh有何不同,
匹配任何一个字符(它是一个通配符)。如果你想匹配一个点,你需要转义
,否则它将充当一个通配符。我理解你的意思。我的观点是双引号。在转义点的双引号中,我们必须加“\”,而要转义\我们必须将其重写为“\”。我的理解是regex“.c”和“\.c”在功能上是相同的。虽然他们是不同的。我说的对吗?你把tcl字符串中的转义和正则表达式中的转义混淆了。“c”表示后跟“c”。\。c的意思是“.”,后跟“c”(圆点被“\”转义,失去特殊能力)。但是tcl(和其他语言)使用反斜杠在双引号(普通字符串)中进行转义,这就是为什么必须编写“\\.c”或{\.c}。建议将大括号用于正则表达式(较少引用)。您可能需要{\.c$},“$”的意思是。@Rupesh很抱歉,我没有收到您的评论通知。米索斯拉夫很好地总结了这一点。看看这是否让它更清晰?在正则表达式中,.c与“\.c”@Rupesh有何不同,
匹配任何一个字符(它是一个通配符)。如果你想匹配一个点,你需要转义
,否则它将充当一个通配符。我理解你的意思。我的观点是双引号。在转义点的双引号中,我们必须加“\”,而要转义\我们必须将其重写为“\”。我的理解是regex“.c”和“\.c”在功能上是相同的。虽然他们是不同的。我说的对吗?你把tcl字符串中的转义和正则表达式中的转义混淆了。“c”表示后跟“c”。\。c的意思是“.”,后跟“c”(圆点被“\”转义,失去特殊能力)。但是tcl(和其他语言)使用反斜杠在双引号(普通字符串)中进行转义,这就是为什么必须编写“\\.c”或{\.c}。建议将大括号用于正则表达式(较少引用)。您可能需要{\.c$},“$”的意思是。@Rupesh很抱歉,我没有收到您的评论通知。米索斯拉夫很好地总结了这一点。看看这是否能让事情变得更清楚?