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

时间:2015-12-24 21:30:12

标签: 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来测试正则表达式

regsub {.*\.\{k\}\.$} $str {}

结果==>空

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

1 个答案:

答案 0 :(得分:2)

在您的代码中,regexp仅返回值1,而不是0.如果要匹配最后一次出现的.{k}.,则必须继续进行子匹配才能得到什么你要。

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

输出

1
.{k}.

$符号不是必须指定行尾,因为我们只想匹配最后一次出现。

使用regsub,您应该使用反向引用来捕获第一组,以便可以正确替换它。

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

输出

st1.st2.{k}.st3.{k}.st4

regsub {.*\.\{k\}\.$} $str {}有什么问题?

好吧,模式.*\.\{k\}\.$将匹配整个字符串,并且您将用空字符串替换它,这就是您获得空结果的原因。

参考: Noncapturing Subpatterns