首页 > 解决方案 > Tcl regsub 用其他字符替换所有字母

问题描述

给定原始字符串,我需要生成相同长度的随机输出字符串。我正在尝试以下方法:

regsub -all  -nocase ABCDEFGHIJKLMNOPQRSTUYWXYZ0123456789 ZYXWYUTSRQPONMLKJIHGFEDCBA9876543210 $str

但输出始终与变量 str 的值无关:

ZYXWYUTSRQPONMLKJIHGFEDCBA9876543210

我的要求是替换或替换 A to Z , B to Y .... 0 to 9 和 9 to 0 之类的东西?我怎样才能做到这一点?

标签: tcl

解决方案


您可以使用string map

# Just generating the replacements, we want to have "A Z B Y C X ... 0 9 ... 9 0"
set letters "ABCDEFGHIJKLMNOPQRSTUYWXYZ"
set numbers "0123456789"
set replacements {}

foreach l [split $letters ""] r [split [string reverse $letters] ""] {
    lappend replacements $l $r
}

foreach n [split $numbers ""] r [split [string reverse $numbers] ""] {
    lappend replacements $n $r
}

# string map in use:
set input "MEW2"
set output [string map -nocase $replacements $input]
# NYD7

regsub 的问题是您不能轻易地告诉它替换映射到特定内容的内容,您必须创建一个单独的过程并进行进一步的替换。为了简单起见,只需使用为这种替换而制作的字符串映射。


推荐阅读