拆分dirname年份

时间:2016-09-27 05:00:49

标签: regex tcl

谁可以将其拆分为变量?名称和年份 dirname和year设置为新变量

来自: !name England.london.2016.Camcorder.mkv

要: dirname England.london 2016年

来自: !name England.london.welsh.2016.Canon.jpg

要: dirname England.london.welsh 2016年

来自: !名字Finnland.Helsinki.1999.Samsung.iphone.jpg

要: dirname Finnland.Helsinki 1999年

来自: !名字Finnland.1999.Camcorder.mkv

要: dnname Finnland 1999年

bind pub "-|-" !name dirs 
proc dirs { nick uhost hand chan text} {

set name [lindex $text 0]

putnow "PRIVMSG $chan :dirname $dirname year $year"
}

2 个答案:

答案 0 :(得分:1)

% #The format reference used is as follows, 
% # 'anytexthere.year.fewmoretexthere'
% proc parse_info {input} {
        set dirname {}
        set year {}
        regexp {^(.*)\.(\d{4})\..*$} $input match dirname year
        return [list $dirname $year]
}
%
% parse_info England.london.2016.Camcorder.mkv
England.london 2016
% parse_info incorrect.film_without.correct-format.mkv
{} {}
% parse_info England.london.welsh.2016.Canon.jpg
England.london.welsh 2016
% parse_info Finnland.Helsinki.1999.Samsung.iphone.jpg
Finnland.Helsinki 1999
% #film name containing numbers in it
% parse_info 1408.2007.Canon.mkv
1408 2007
%

答案 1 :(得分:0)

set data {
    England.london.2016.Camcorder.mkv
    England.london.welsh.2016.Canon.jpg
    Finnland.Helsinki.1999.Samsung.iphone.jpg
    Finnland.1999.Camcorder.mkv
}

foreach line [split [string trim $data] \n] {
    set dirname {}
    foreach word [split [string trim $line] .] {
        if {[string is digit -strict $word]} {
            break
        } else {
            lappend dirname $word
        }
    }
    puts "dirname [join $dirname .] year $word"
}

这个将数据分成行,将行分成单词。对于每一行,它会收集dirname的单词,直到它找到一个除了数字之外没有任何内容的单词,然后打印出它的内容。

另一种方法是,将正则表达式与每一行匹配:

foreach {- dirname year} [regexp -all -inline -line {^\s*([^\d]*)(\d{4})} $data] {
    puts "dirname [string trimright $dirname .] year $year"
}

文档: breakforeachifjoinlappendputsregexpsetsplitstringSyntax of Tcl regular expressions