TCL字符串操作和提取

TCL字符串操作和提取,tcl,Tcl,我有一个字符串xxxxxxx-s12345ab7_0_0_xx2.log,需要在TCL中有一个类似AB700_xx2的输出 ab将是分隔符,需要从ab提取到(包括ab),并且只需删除前两个下划线 尝试了字符串修剪、字符串修剪左和字符串修剪右,但没有多大用处。TCL中是否有类似于字符串拆分的东西?第一步是提取基本的相关子字符串;最简单的方法实际上是使用正则表达式: set inputString "xxxxxxx-s12345ab7_0_0_xx2.log" if {![regexp {ab[^

我有一个字符串
xxxxxxx-s12345ab7_0_0_xx2.log
,需要在TCL中有一个类似
AB700_xx2
的输出

ab
将是分隔符,需要从
ab
提取到
(包括
ab
),并且只需删除前两个下划线


尝试了
字符串修剪
字符串修剪左
字符串修剪右
,但没有多大用处。TCL中是否有类似于
字符串拆分的东西?

第一步是提取基本的相关子字符串;最简单的方法实际上是使用正则表达式:

set inputString "xxxxxxx-s12345ab7_0_0_xx2.log"

if {![regexp {ab[^.]+} $inputString extracted]} {
    error "didn't match!"
}
puts "got $extracted"
# ===> got ab7_0_0_xx2
然后,我们想用
字符串映射
去除那些讨厌的下划线:

set final [string map {"_" ""} $extracted]
puts "got $final"
# ===> ab700xx2
嗯,不完全是我们想要的!我们想保留最后一个下划线,并在第一部分加上大小写

set pieces [split $extracted "_"]
set final [string toupper [join [lrange $pieces 0 2] ""]]_[join [lrange $pieces 3 end] "_"]
puts "got $final"
# ===> got AB700_xx2

split
命令将字符串分成“记录”通过一个可选的记录说明符(默认为任何空白字符),我们可以通过列表操作轻松地操作它。
join
命令的作用正好相反,但这里我在一半上使用了一个空记录说明符,这使得所有内容都可以连接起来。我想你可以猜出
字符串的上限是什么
lrange
命令do…

第一步是提取基本的相关子字符串;最简单的方法实际上是使用正则表达式:

set inputString "xxxxxxx-s12345ab7_0_0_xx2.log"

if {![regexp {ab[^.]+} $inputString extracted]} {
    error "didn't match!"
}
puts "got $extracted"
# ===> got ab7_0_0_xx2
然后,我们想用
字符串映射
去除那些讨厌的下划线:

set final [string map {"_" ""} $extracted]
puts "got $final"
# ===> ab700xx2
嗯,不完全是我们想要的!我们想保留最后一个下划线,并在第一部分加上大小写

set pieces [split $extracted "_"]
set final [string toupper [join [lrange $pieces 0 2] ""]]_[join [lrange $pieces 3 end] "_"]
puts "got $final"
# ===> got AB700_xx2
split
命令将字符串分成“记录”通过一个可选的记录说明符(默认为任何空白字符),我们可以通过列表操作轻松地操作它。
join
命令的作用正好相反,但这里我在一半上使用了一个空记录说明符,这使得所有内容都可以连接起来。我想你可以猜出
字符串的上限是什么
lrange
命令执行…

设置“xxxxxxx-s12345ab7\u 0\u xx2.log”
设置一个[拆分$a”“]
设置触发器0
设置提取“”
对于{set i 0}{$i<[l长度$a]}{incr i}{
如果{“ab”eq“[lindex$a$i][lindex$a[expr$i+1]]”{
设置触发器1
}
如果{$trig==1}{
追加摘录[lindex$a$i]
}
}
设置提取“[string toupper[join[lrange[split[lindex[split$extract.]0]]0 end-1]”“][lindex[split[lindex[split$extract.]0]]end]”
放入$extract
设置“xxxxxxx-s12345ab7\u 0\u xx2.log”
设置一个[拆分$a”“]
设置触发器0
设置提取“”
对于{set i 0}{$i<[l长度$a]}{incr i}{
如果{“ab”eq“[lindex$a$i][lindex$a[expr$i+1]]”{
设置触发器1
}
如果{$trig==1}{
追加摘录[lindex$a$i]
}
}
设置提取“[string toupper[join[lrange[split[lindex[split$extract.]0]]0 end-1]”“][lindex[split[lindex[split$extract.]0]]end]”
放入$extract

只有regexp就足够了

设置字符串
“xxxxxxx-s12345ab7\u 0\u xx2.log”

设置字符串
“$s1$s2$s3$s4\\u$s5”


Puts
$rstring

只有regexp就足够了

设置字符串
“xxxxxxx-s12345ab7\u 0\u xx2.log”

设置字符串
“$s1$s2$s3$s4\\u$s5”


放置
$rstring

您能解释一下字符串的结构吗?
ab
分隔符是否始终相同?7、0、0是否始终是个位数?x是一个任意字符占位符吗?
string trim*
不是这个作业的正确工具,
string split
只是被称为
split
…您能解释一下字符串的结构吗?
ab
分隔符是否始终相同?7、0、0是否始终是个位数?x是一个任意字符占位符吗?
string trim*
不是这个工作的合适工具,而
string split
只是被称为
split
…我会做
regsub-all{uu(\ d)}$extracted{\1}final
来删除“内部”下划线,给出或接受未说出的要求。我会做
regsub all{ud}$extracted{\1}final
要删除“内部”下划线,请给出或接受未说出的要求。