我想在字符串后提取字符串,直到tcl中的点(。)

时间:2018-03-12 07:36:25

标签: regex tcl

例如

set a abc.def.efg.hij.jkl

我需要在def之后加上下一个点(.),即:efg

你可以帮帮我吗? 我可以获得正则表达式吗?

3 个答案:

答案 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

文档: dictforeachlrangeprocreturnsetsplit