Assuming all words are simple REs (no metacharacters): proc findAllWords {wordList text} { set start 0 while {[llength $wordList]} { set RE [join $wordList |] if {![regexp -start $start -indices $RE $text range]} { return 0 } set word [eval [list string range $text] $range] set idx [lsearch -exact $wordList $word] set wordList [lreplace $wordList $idx $idx] set start [expr {[lindex $range 1]+1}] } return 1 } [RS] understood the task differently, more like cascaded [grep]s: proc findAllWords {wordlist linelist} { set res {} foreach line $linelist { set missed 0 foreach re $wordlist { if {![regexp -- $re $line]} {set missed 1; break} } if {!$missed} {lappend res $line} } return $res } [WJP] Posting code for a problem that isn't stated isn't all that helpful. Could someone please state the problem?