从字符串中删除前缀子字符串

sbh*_*tla 3 tcl

我有一个字符串abc.def.ghi.j,我想从中删除abc.,以便我有def.ghi.j.

1)删除具有特定模式的前缀的最佳方法是什么?

2)因为在这种情况下,abc巧合的是前缀,这可能会使事情变得更容易。如果我们想要abc.ghi.j作为输出怎么办?

我用这样的split方法试过了

set name abc.def.ghi.j
set splitVar [split $name {{abc.}} ]
Run Code Online (Sandbox Code Playgroud)

问题是它拆分为、和 中的每一个a,而不是作为一个整体分开。bc.

Don*_*ows 5

嗯,有几种方法,但主要的是使用string replace, regsub, string map, 或split- lreplace- join

我们可能应该小心一点,因为我们必须首先检查前缀是否真的是前缀。幸运的是,string equal有一个-length操作可以轻松实现:

if {[string equal -length [string length $prefix] $prefix $string]} {
    # Do the replacement
}
Run Code Online (Sandbox Code Playgroud)

就个人而言,我可能会使用,regsub但我很高兴使用 RE 引擎技巧。

使用 string replace

set string [string replace $string 0 [string length $prefix]-1]
# Older versions require this instead:
# set string [string replace $string 0 [expr {[string length $prefix]-1}]]
Run Code Online (Sandbox Code Playgroud)

使用 regsub

# ***= is magical and says "rest of RE is simple plain text, no escapes"
regsub ***=$prefix $string "" string
Run Code Online (Sandbox Code Playgroud)

使用 string map

# Requires cunning to anchor to the front; \uffff is unlikely in any real string
set string [string map [list \uffff$prefix ""] \uffff$string]
Run Code Online (Sandbox Code Playgroud)

使用splitjoin

这是关于你试图做的事情。它依赖.作为一种分离的。

set string [join [lrange [split $string "."] 1 end] "."]
Run Code Online (Sandbox Code Playgroud)