regsub匹配作为lindex索引,对抗irc控制字符

时间:2013-02-16 07:35:31

标签: tcl eggdrop

好吧,我一直在互联网上搜索过去10多个小时没有运气或成功。

我试图将irc控制代码(颜色等)转换为html,输入文本从eggdrop tcl绑定事件中提取。粗体/下划线工作正常..尚未测试斜体,但这不是问题所在。

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

我的流程代码如下,它是一个更大的脚本的一部分,它将文本记录到文件中。其他一切都有效,但这个过程。

关于问题..我到底做错了什么?我收到的唯一错误消息类似于'(控制字符)无效索引'。

proc logger:control {text} {

    set val {
        {FFF}
        {000}
        {00007F}
        {009000}
        {FF0000}
        {7F0000}
        {9F009F}
        {FF7F00}
        {FFFF00}
        {00F800}
        {00908F}
        {00FFFF}
        {0000FF}
        {FF00FF}
        {7F7F7F}
        {CFD0CF}
    }

    while {[regsub {\002(.*?)\002} $text {<b>\1</b>} text]} {}
    while {[regsub {\037(.*?)\037} $text {<u>\1</u>} text]} {}
    while {[regsub {\035(.*?)\035} $text {<i>\1</i>} text]} {}
    while {[regsub {\003([0-9]+)[,]?(\d*)(.*?)} $text "</span><span style='color: [lindex $val \1] ;'>\3" text]} {}
    # ^ the line that throws the error
    while {[regsub {\003[^\d]} $text {$text</span>} text]} {}

    return $text
}

1 个答案:

答案 0 :(得分:2)

正如你所说,问题是这一行:

while {[regsub {\003([0-9]+)[,]?(\d*)(.*?)} $text "</span><span style='color: [lindex $val \1] ;'>\3" text]} {}

第一个问题是,Tcl会立即解释替换中的\digit,因为您引用了"双引号"。修复?使用大括号:

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]

注意,在使用此技巧时,您必须小心确保RE考虑额外的反斜杠。值得庆幸的是,在你的情况下它没有任何区别,因为你的模式与反斜杠不匹配。