【问题标题】:regsub match as lindex index, against irc control charactersregsub 匹配为 lindex 索引,针对 irc 控制字符
【发布时间】: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),然后在另一个 regsub lindex $val $catch 中调用它?
  • @Jerry: 不,是 Tcl 太早替换了\1
  • RE 匹配似乎可以更有效地完成。查看regsub-all 选项的作用...

标签: tcl eggdrop


【解决方案1】:

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

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

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

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

second 的问题是,之后您将在文本中获得文字 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 比我想象的要复杂一些。
  • @Daedalus:多年来,我一直想为regsub 实现某种命令替换,但确切地确定它应该做什么是很棘手的……
  • 是的,这是为数不多的真正棘手的部分之一; string map/regsub/subst 序列不是您可能自己发明的序列。 (我最初是从 Brent Welch 那里得到的,只是当时我们没有 string map……)
猜你喜欢
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
相关资源
最近更新 更多