好吧,我一直在互联网上搜索过去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
}
答案 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考虑额外的反斜杠。值得庆幸的是,在你的情况下它没有任何区别,因为你的模式与反斜杠不匹配。