A function to substitute parts of a string matching a regular expression with the result of a script called using the match as argument. Code and examples will be much more clear then my english: proc regmap {re string script} { set submatches [lindex [regexp -about $re] 0] lappend varlist idx while {[incr submatches -1] >= 0} { lappend varlist _ } set res $string set indices [regexp -all -inline -indices $re $string] set delta 0 foreach $varlist $indices { foreach {start end} $idx break set substr [string range $string $start $end] set toeval [string map [list %s $substr] $script] set subresult [eval $toeval] incr start $delta incr end $delta set res [string replace $res $start $end $subresult] incr delta [expr {[string length $subresult]-[string length $substr]}] } return $res } Example: puts [regmap {[0-9]+} "1 20 hello 30 how are you 40" {expr %s+1}] puts [regmap {[a-z]+} "My name is merz" {format "%s([string length %s])"}] The output is the following: -- [SS] 2 21 hello 31 how are you 41 My(1) name(4) is(2) merz(4)