2016-09-27 43 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