回引用在tcl-regexp中不起作用



我是正则表达式和tcl的新手,长期以来一直面临着非常基本的问题。

我的任务是找到给定单词中的所有字符,它们的下一个字符与这个字符不相同。我写了以下tcl片段来实现这一点:

set str "goooo";
set lst [regexp -all -inline {(w)[^1]} $str];
puts $lst

我得到以下错误:

couldn't compile regular expression pattern: invalid escape  sequence
while executing
"regexp -all -inline {(w)[^ 1]} $str"

有没有其他方法可以在tcl中使用反向引用?

Backreferences不能在任何regex风格的括号表达式中使用。[^1]匹配除x01字符之外的任何字符。之所以会出现这种情况,是因为括号表达式旨在使用精确的文字字符或它们的范围

在您的情况下,您可以使用(w)1+删除所有重复的字符块(同时使用替换模式中的1backreference替换为相同的单个字符(,然后提取单词chars:

set lst [regexp -all -inline {w} [regsub -all {(w)1+} $str {1}]];

查看在线演示:

set str "sddgoooo";
set lst [regexp -all -inline {w} [regsub -all {(w)1+} $str {1}]];
puts $lst

输出:

s d g o

注意,在其他regex风格中,您可以使用具有负前瞻性的regex:(w)(?!1)(请参阅此regex演示(。(?!1)负前瞻匹配没有立即跟在Group 1值后面的位置。不幸的是,尽管Tcl-ARE通常支持lookahead,但Tcl-regex-flavor不支持带有backreference的lookahead。

最新更新