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\}
)。可能是这样吗?请提供一个示例代码,我们可以使用它重现您遇到的问题。