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? - [RS]: The problem came uo in [the Tcl chatroom]: a substitute for ''agrep'' in pure Tcl which allows searching for several terms in no particular order. E.g. agrep 'foo;bar;grill' will report lines that contain "foo..grill..bar" or "bar..grill..foo", etc.