TCL:regexp排除包含字符的字符串

TCL:regexp排除包含字符的字符串,tcl,Tcl,我对TCL或使用TCL regexp不太熟练。但是我需要一个TCL机制/regexp,如果给一行/一句话,它可以排除或告知一个单词有一些特殊字符 假设我有一行/句子如下: (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" " "

我对TCL或使用TCL regexp不太熟练。但是我需要一个TCL机制/regexp,如果给一行/一句话,它可以排除或告知一个单词有一些特殊字符

假设我有一行/句子如下:

 (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循环中具有特殊字符的单词,如:

(not
sure)
4:00:00AM
排除单词开头、结尾或任何地方有“(”或“:”的单词


请告诉我如何实现这一点。

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

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
}

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

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
}
alnum_words
现在包含列表
{At please do your work}

如果你只想要由字母组成的单词,使用

lsearch -inline -regexp -all $words {^[[:alpha:]]+$}
alnum_words
现在包含列表
{At please do your work}

如果你只想要由字母组成的单词,使用

lsearch -inline -regexp -all $words {^[[:alpha:]]+$}