我是正则表达式和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+
删除所有重复的字符块(同时使用替换模式中的1
backreference替换为相同的单个字符(,然后提取单词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。