例如
set a abc.def.efg.hij.jkl
我需要在def
之后加上下一个点(.
),即:efg
答案 0 :(得分:1)
以下是Tcl中的三个正则表达式示例:
set a abc.def.efg.hij.jkl
# Get next token after "abc.def."
set re1 {^abc\.def\.([^.]*)\.}
if {[regexp $re1 $a match token]} {
puts "re1: $token"
}
# Get next token after "def."
set re2 {^.*def\.([^.]+)\.}
if {[regexp $re2 $a match token]} {
puts "re2: $token"
}
# Get next token after the second "dot-separated" token
set re3 {^[^.]*\.[^.]*\.([^.]*)\.}
if {[regexp $re3 $a match token]} {
puts "re3: $token"
}
注意,[^.]
匹配任何非点字符,而\.
匹配exaclty点字符。
答案 1 :(得分:0)
使用单词边界约束,您可以为此任务制作相当短的RE:
set RE {\ydef\.([^.]+)}
if {[regexp $RE $a -> token]} {
puts "I found a '$token' for you"
}
但是,在这种情况下,我们也可以使用拆分和列表搜索;有些人更喜欢这种方法:
set items [split $a "."]
set idx [lsearch -exact -- $items "def"]
if {$idx >= 0} {
set token [lindex $items [expr {$idx + 1}]]
puts "I found a '$token' for you"
}
当然,您可以使用更复杂的方法来查找def
,具体取决于您的真实代码......
答案 2 :(得分:0)
您可以将字符串转换为字典,其中每个值都是键字符串的后继字符。
proc makeSuccessorDict items {
set result {}
foreach key $items val [lrange $items 1 end] {
dict set result $key $val
}
return $result
}
set sd [makeSuccessorDict [split $a .]]
% dict get $sd def
efg
% dict get $sd hij
jkl
% dict get $sd jkl