2013-02-16 1 views
2

Ну, я искал в Интернете за последние 10 с лишним часов без удачи или успеха относительно этого ..regsub матч как индекс Lindex, против управляющих символов Irc

Я пытаюсь преобразовать управляющие коды ИРЦ (цвета и т. д.) в html, входной текст, вырванный из связанного события eggdrop tcl. Полужирный/подчеркивающий отлично работает .. еще не проверил курсив, но это не то, о чем идет речь.

.. Проблема в том, что мое регулярное выражение, похоже, соответствует неправильному символу. Я настроил свое регулярное выражение - я предположил, что знаю из предыдущего опыта в кодировании (в основном, php/js) - для сопоставления с \003(\d+)[,]?(\d*)(.*?), так как я хочу цифры после символа управления, а затем использовать в качестве индекса в списке , чтобы вытащить требуемый html hex-цвет. Тем не менее, число, которое вытаскивается, кажется, даже не является числом, а не отображается правильно в терминале, и вместо этого выглядит как контрольный символ (из моего опыта использования 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

Похоже, что tcl не заменяет '\ 1', что вызывает ошибку. Может быть, вы можете назначить первый catch переменной (например, catch), а затем вызвать ее в другом regsub 'lindex $ val $ catch'? – Jerry

+0

@Jerry: Нет, это то, что Tcl заменяет '\ 1' слишком рано. –

+0

Кажется, что спички RE выглядят более эффективно. Посмотрите, что делает опция '-all' для' regsub' ... –

ответ

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 принимает во внимание дополнительные обратные слэши при использовании этого трюка. К счастью, в вашем случае это не имеет никакого значения, поскольку ваш шаблон не соответствует обратным слэшам.

+0

Благодарим вас за это, я часами искал свои мозги, пытаясь понять, почему он не работает. Кажется, tcl немного сложнее, чем я себе представлял , – Daedalus

+0

@Daedalus: Я имел в виду реализовать какую-то подстановку команд для 'regsub' целую вечность, но прибивать точно то, что он должен делать, это сложно ... –

+0

И да, это один из немногих действительно хитрых битов; последовательность 'string map' /' regsub'/'subst' не является той, которую вы, вероятно, будете изобретать самостоятельно. (Я получил его из Брент Уэлч, за исключением того, что у нас тогда не было «строковой карты» ...) –