tcl:regexp匹配字符串末尾的子字符串

tcl:regexp匹配字符串末尾的子字符串,regex,tcl,Regex,Tcl,我尝试匹配字符串中多次出现的子字符串 str1 = st1.st2.{k}.st3.{k}.st4.{k}. str2 = st1.st2.{k}.st3.{k}.st4. 我使用regexp匹配str1末尾的“{k}”: regexp .*\.\{k\}\.$ $str1 但是我得到了0!! 事实上,我使用regsub来测试regexp regsub {.*\.\{k\}\.$} $str {} 结果==>空 如果模式匹配,匹配的字符串将被删除!! regexp表达式中缺少什么?在代码

我尝试匹配字符串中多次出现的子字符串

str1 = st1.st2.{k}.st3.{k}.st4.{k}.
str2 = st1.st2.{k}.st3.{k}.st4.
我使用regexp匹配str1末尾的
“{k}”

regexp .*\.\{k\}\.$ $str1 
但是我得到了0!! 事实上,我使用regsub来测试regexp

regsub {.*\.\{k\}\.$} $str {}
结果==>空

如果模式匹配,匹配的字符串将被删除!!
regexp表达式中缺少什么?

在代码中,
regexp
仅返回值1,而不是0。当您想要匹配上次出现的
{k}.
时,必须进行子匹配以获得所需的内容

set str1 st1.st2.{k}.st3.{k}.st4.{k}.
puts [regexp ".*(\.{k}\.)" $str1 whole last]
puts $last
输出:

1
.{k}.
st1.st2.{k}.st3.{k}.st4
$
符号不是指定行尾的强制符号,因为我们只是想匹配最后一次出现的情况

使用
regsub
,您应该使用back引用来捕获第一组,以便正确地替换它

puts [regsub "(.*)(\.{k}\.)" $str1 "\\1"] 
输出:

1
.{k}.
st1.st2.{k}.st3.{k}.st4
regsub{.*\.{k\}.$}$str{}
有什么问题

好的,模式
*\.\{k\}.$
将匹配整个字符串,您将用空字符串替换它,这就是为什么您会得到空结果


Reference:

我不确定TCL,但一般来说,
{}
正则表达式是特殊字符,所以它们需要转义(类似于
\{k\}
)。可能是这样吗?请提供一个示例代码,我们可以使用它重现您遇到的问题。