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
greps:
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.