TCL regsub несколько специальных символов в одном кадре

Есть ли способ добавить escape '\' в строку с несколькими специальными символами?

Пример ввода: a/b[1]/c/d{3}
Желаемый результат: a\/b\[1\]\/c\/d\{3\}

Я сделал это в нескольких regsubs один специальный символ за раз. Но есть ли способ сделать это одним выстрелом?

2 ответа

Решение

Я бы просто избежал всех несловарных символов:

set input {a/b[1]/c/d{3}}
set output [regsub -all {\W} $input {\\&}]
puts $output
a\/b\[1\]\/c\/d\{3\}

ref: https://tcl.tk/man/tcl8.6/TclCmd/regsub.htm и https://tcl.tk/man/tcl8.6/TclCmd/re_syntax.htm

Общий подход заключается в создании набора символов RE ([…]) и использовать это. Вы должны быть немного осторожнее с ними в некоторых случаях (некоторые символы в них особенные, особенно ^, ], - а также \), но это не так уж сложно.

regsub -all {[][/{}]} $input {\\&}

Однако, если вы можете использовать классы символов (такие как \W или же [^\w]) тогда это намного проще и легче для чтения. Наиболее распространенные случаи необходимости применять обратную косую черту работают с ними.

Другие вопросы по тегам