【发布时间】:2013-02-17 01:35:14
【问题描述】:
好吧,过去 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
}
【问题讨论】:
-
似乎 tcl 没有替换导致错误的
\1。也许您可以为第一个 catch 分配一个变量(比如 catch),然后在另一个 regsublindex $val $catch中调用它? -
@Jerry: 不,是 Tcl 太早替换了
\1。 -
RE 匹配似乎可以更有效地完成。查看
regsub的-all选项的作用...