regsub соответствует индексу lindex, по контрольным символам irc

Что ж, я искал в Интернете последние 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
}

person Daedalus    schedule 16.02.2013    source источник
comment
Похоже, что tcl не заменяет \1, что вызывает ошибку. Может быть, вы могли бы присвоить первой переменной catch переменную (скажем, catch), а затем вызвать ее в другом regsub lindex $val $catch?   -  person Jerry    schedule 16.02.2013
comment
@Jerry: Нет, дело в том, что Tcl слишком рано заменяет \1.   -  person Donal Fellows    schedule 16.02.2013
comment
Похоже, что матчи RE могут быть проведены более эффективно. Посмотрите, что делает параметр -all для regsub  -  person Donal Fellows    schedule 16.02.2013


Ответы (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]} {}

Вторая проблема заключается в том, что после этого вы получите буквальные фрагменты команды Tcl в тексте. Наверное, не то, что вы хотите! Увы, ничего подобного флагу /e в Perl здесь нет; вам нужен совершенно другой подход:

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

person Donal Fellows    schedule 16.02.2013
comment
Спасибо за это, я часами ломал себе голову, пытаясь понять, почему это не работает ... кажется, tcl немного сложнее, чем я представлял. - person Daedalus; 17.02.2013
comment
@Daedalus: Я давно хотел реализовать какую-то замену команд для regsub, но определить, что именно он должен делать, сложно ... - person Donal Fellows; 17.02.2013
comment
И да, это одна из немногих действительно хитрых вещей; последовательность _1 _ / _ 2 _ / _ 3_ не та, которую вы, вероятно, придумаете самостоятельно. (Первоначально я получил его от Брента Уэлча, за исключением того, что у нас тогда не было string map…) - person Donal Fellows; 17.02.2013