2012-11-22 61 views
1

我对TCL或使用TCL正则表达式并不熟练。但是我需要一个TCL机制/正则表达式,它可以排除或让一个单词在给定一行/句子时有一些特殊字符。TCL:正则表达式排除具有字符的字符串

假设我有一个像下方的行/句子的东西:

(space)(space)At 4:00:00AM (not sure) please do your work ... 

现在我尽量拆分行使用的foreach获得每字循环:

% set fields [split " At 4:00:00AM (not sure) please do your work" " " ] 
{} {} {} At 4:00:00AM (not sure) please do your work 

但我再做一次不想空字段:

% foreach val $fields { 
     puts $val 
} 



At 
4:00:00AM 
(not 
sure) 
please 
do 
your 
work 

除此之外,我想排除foreach厕所中的词p有特殊字符,如:

(not 
sure) 
4:00:00AM 

排除在单词的开始,结束或任何位置有'('或':'的单词。

请让我怎么做到这一点。

回答

0

不幸的是,Tcl正则表达式不支持look-behind操作符。否则,它可以通过一个正则表达式来实现。 但是,你可以使用下面的代码来构建的单词列表,你需要:

set the_line " At 4:00:00AM (not sure) please do your work" 
set fields {} 
foreach {- val} [regexp -all -inline -- {(?:^|\s)([^:()\s]+(?=\s|$))} $the_line] { 
    lappend fields $val 
} 
1
set str " At 4:00:00AM (not sure) please do your work" 

# split the string into space-delimited words 
set words [regexp -inline -all {\S+} $str] 

# eliminate words containing a character other than letters, numbers, underscore 
set alnum_words [lsearch -inline -regexp -all -not $words {\W}] 

alnum_words现在包含列表{At please do your work}

如果只想仅由字母的话,使用

lsearch -inline -regexp -all $words {^[[:alpha:]]+$} 
相关问题