2016-12-29 6 views
0

см. Код ниже, в качестве примера я пытаюсь найти использование regsub с backrefeence как средство выборочного использования string toupper. Я не понимаю, чего я ожидал.
См. Простой пример ниже (да, я знаю, что могу использовать string toupper $string 0 0, однако это просто для иллюстрации принципа, в простом примере).Команда tcl string не работает с regexp backreference

> puts [ regsub {^(.)} "min" "s\\1" ] 
smin 
> puts [ regsub {^(.)} "min" [ string toupper "\\1" ] ] 
min 

Как можно видеть, строка ToUpper применяется на обратной ссылке не работает, но backrefernce можно использовать в операции двойной кавычек.
Я использую TCL ver. 8.6

+0

... и нет никакого способа, он может работать, как 'строка toupper' команда получает выполненных перед командой 'regsub'. –

+0

См. Https://ideone.com/EjXgje –

ответ

1

string toupper работает, но не делает то, что вы хотите; string toupper "\\1" - это просто строка \1, так что regsub не оказывает большого эффекта. Проблема в том, что regsub не имеет никакого способа выполнить «запустить эту команду на сайтах замещения»; Я хотел бы исправить это в течение многих лет, но никогда не делал этого (слишком много проектов для этого, чтобы сделать это на первый план).

Вместо этого вам нужно regsub в командной подстановки в строку, а затем subst результат, но для того, чтобы сделать это, вам нужно сначала сделать строку иначе безопасной для subst с string map. К счастью, на самом деле это довольно просто.

Я разделить это друг от друга, чтобы сделать его проще для вас, чтобы исследовать то, что делает каждый этап:

set str "here is an example with \$dollars, \[brackets\] and \\backslashes" 

# Quote all of Tcl's metacharacters; there's not that many 
set safer [string map {[ \\[ ] \\] \\ \\\\ $ \\$} $str] 

# Inject the command we want to run where we want to run it 
set withsubst [regsub {^(.)} $safer {[string toupper {\1}]}] 

# Perform the substitution 
set result [subst $withsubst] 
+0

Я _really_ должен написать предложение 'regsub -command' ... –

+0

Ну, это определенно сложнее, чем то, что вы найдете в подменю регулярного выражения, предлагаемой, скажем, Ruby. Я попытаюсь приготовить некоторую оболочку вокруг процедуры. Спасибо – user1134991

+1

Я знаю; это раздражало меня в течение многих лет, что нам нужно делать такие вещи. –