2016-09-27 41 views
2

誰可以將其分解爲變量?對於名稱和年份 目錄名和年份設置爲一個新的變量split dirname year

來源:! 名England.london.2016.Camcorder.mkv

要: 目錄名England.london 2016年

從! 名England.london.welsh.2016.Canon.jpg

要: 目錄名England.london.welsh 2016年

來源:! 名Finnland.Helsinki.1999.Samsung.iphone.jpg

要: 目錄名Finnland.Helsinki 1999年度

來源:! 名Finnland.1999.Camcorder.mkv

要: 目錄名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" 
} 

回答

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 
% 
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" 
} 

文檔: breakforeachifjoinlappendputsregexpsetsplitstring, Syntax of Tcl regular expressions