Tcl 根据irc控制字符,将regsub匹配为lindex索引

Tcl 根据irc控制字符,将regsub匹配为lindex索引,tcl,eggdrop,Tcl,Eggdrop,嗯,在过去的10多个小时里,我一直在互联网上搜索,但在这方面我既没有运气也没有成功 我试图将irc控制代码(颜色等)转换为html,即从eggdrop tcl绑定事件中提取的输入文本。粗体/下划线很好用。。还没有测试斜体字,但这不是问题所在 。。问题是,我的正则表达式似乎与错误的字符匹配。我设置了我的正则表达式——我假设从以前的编码经验(主要是php/js)中了解了正则表达式——以匹配\003(\d+[,]?(\d*)(.*),因为我希望控制字符后的数字用作列表中的索引,以提取所需的html十六

嗯,在过去的10多个小时里,我一直在互联网上搜索,但在这方面我既没有运气也没有成功

我试图将irc控制代码(颜色等)转换为html,即从eggdrop tcl绑定事件中提取的输入文本。粗体/下划线很好用。。还没有测试斜体字,但这不是问题所在

。。问题是,我的正则表达式似乎与错误的字符匹配。我设置了我的正则表达式——我假设从以前的编码经验(主要是php/js)中了解了正则表达式——以匹配
\003(\d+[,]?(\d*)(.*)
,因为我希望控制字符后的数字用作列表中的索引,以提取所需的html十六进制颜色。然而,被拉取的数字看起来甚至不是一个数字,在终端中没有正确显示,而是一个控制字符(根据我使用gedit的经验)

下面是我的流程代码,它是一个较大脚本的一部分,该脚本将文本记录到一个文件中。除此之外,其他一切都是有效的

回答这个问题。。我到底做错了什么?我收到的唯一错误消息类似于“(控制字符)无效索引”

proc记录器:控件{text}{
设定值{
{FFF}
{000}
{00007F}
{009000}
{FF0000}
{7F0000}
{9F009F}
{FF7F00}
{FFFF00}
{00F800}
{00908F}
{00FFFF}
{0000FF}
{FF00FF}
{7F7F7F}
{CFD0CF}
}
而{[regsub{\002(.*?\002}$text{\1}text]}{}
而{[regsub{\037(.*?\037}$text{\1}text]}{}
而{[regsub{\035(.*?\035}$text{\1}text]}{}
而{[regsub{\003([0-9]+)[,]?(\d*)(.*)}$text“\3”text]}{}
#^引发错误的行
而{[regsub{\003[^\d]}$text{$text}text]}{}
返回$text
}

正如您所说,问题在于这一行:

while {[regsub {\003([0-9]+)[,]?(\d*)(.*?)} $text "</span><span style='color: [lindex $val \1] ;'>\3" text]} {}
第二个问题是,之后的文本中会出现文本Tcl命令片段。可能不是你想要的!唉,这里没有什么比Perl中的
/e
标志更好的了;你需要一种完全不同的方法:

# First, defang any Tcl metacharacters
set text [string map {\\ \\\\ [ \\[ ] \\] $ \\$} $text]
# Second, do the replacements, inserting Tcl fragments
while {[regsub {\003([0-9]+)[,]?(\d*)(.*?)} $text {</span><span style='color: [lindex $val \1] ;'>\3} text]} {}
# Third, do the substitutions we just inserted
set text [subst $text]
#首先,删除任何Tcl元字符
设置文本[字符串映射{\\\\\[\\[\\[\\]$\\\$}$text]
#其次,进行替换,插入Tcl片段
而{[regsub{\003([0-9]+)[,]?(\d*)(.*)}$text{\3}text]}{}
#第三,做我们刚刚插入的替换
设置文本[subst$text]

注意,在使用此技巧时,您必须小心确保您的RE考虑了额外的反斜杠。谢天谢地,在您的情况下,这没有什么区别,因为您的模式与反斜杠不匹配。

似乎tcl没有替换导致错误的
\1
。也许您可以将第一个catch指定为一个变量(比如catch),然后在另一个regsub
lindex$val$catch
中调用它?@Jerry:不,这是因为Tcl过早地替换了
\1
。重新匹配似乎可以更有效地完成。查看
-all
选项对
regsub
的作用……谢谢你,我绞尽脑汁想了好几个小时,想弄清楚它为什么不起作用。。似乎tcl比我想象的要复杂一点。@Daedalus:多年来,我一直想实现某种命令替换来代替
regsub
,但要确定它应该做什么是很棘手的……是的,这是少数真正棘手的事情之一;
字符串映射
/
regsub
/
subst
序列不是您可能自己发明的序列。(我最初是从布伦特·韦尔奇那里得到它的,只是当时我们没有
字符串映射
。)那么,我感谢这个网站的存在,感谢你是其中的一员,呵呵。
# First, defang any Tcl metacharacters
set text [string map {\\ \\\\ [ \\[ ] \\] $ \\$} $text]
# Second, do the replacements, inserting Tcl fragments
while {[regsub {\003([0-9]+)[,]?(\d*)(.*?)} $text {</span><span style='color: [lindex $val \1] ;'>\3} text]} {}
# Third, do the substitutions we just inserted
set text [subst $text]