tcl - regsub 匹配为 lindex 索引,针对 irc 控制字符

标签 tcl eggdrop

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

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

.. 问题是,我的正则表达式似乎匹配了错误的字符。我设置了我的正则表达式 - 我假设从以前的编码经验(主要是 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
}

最佳答案

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

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

第一个问题是 Tcl 立即解释替换中的 \digit,正如您用 "double- 引用的那样引号"。修复?使用大括号:

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

关于tcl - regsub 匹配为 lindex 索引,针对 irc 控制字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14908109/

相关文章:

tcl - 需要一些有关 TCL 封装的说明

string - 如何将 Tcl 列表框数字索引转换为其元素

if-statement - 如何检查字符串是否为空

string - 从变量中读取最后一个完整单词

linux - 将日志文件从一种时间格式批量重命名为另一种时间格式

tcl - Tcl 中的全局变量

string - TCL 字符串前置

mysql - 将 foreach 列表排序为 unix 时间戳

python - 用 tcl 编写的 irc bot 与 python/node.js 克隆相比如何?