嗯,过去 10 多个小时我一直在互联网上搜索,但在这方面没有运气或成功......
我正在尝试将 irc 控制代码(颜色等)转换为 html,即从 Eggdrop 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/