2

好吧,在过去的 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
}
4

1 回答 1

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 命令片段。可能不是你想要的!唉,这里没有像/ePerl 中的标志那样的东西。你需要一种完全不同的方法:

# 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 考虑到额外的反斜杠。值得庆幸的是,在您的情况下,因为您的模式与反斜杠不匹配,所以没有什么区别。

于 2013-02-16T17:35:14.583 回答