John Leary wrote:
> Greetings
>
> Can you help me please - there must be a simple solution to this problem,
> but I can't find it.
>
> From a list of character strings and a list of templates, I need to
> produce a list of all strings that match any of the templates. For example:
>
> listData={"18K0F3C--" , "2K40GXX--" , "400HGXX--" , "5M00G1F--" , "960KG1D--"}
> listTemplates={"???H?????" , "???K?????"}
> result={"400HGXX--","960KG1D--"}
>
> In the templates, ? is a wild-card that represents a single character.
> The data strings contain only alpha-numeric characters and hyphens - no
> other characters.
> There are no special requirements for the result: duplication and random
> order are acceptable.
Here's one way to do it: implement a matchTemplatesQ function that
yields true if any of the templates is matched.
Note that matchTemplatesQ depends on listTemplates which is not given as
an argument -- Personally I don't have a problem with polution of the
global namespace, but you'll probably get some followup on this...
matchTemplatesQ[s_String] :=
Or @@ ((MatchQ[Characters[s], Characters[#] /. "?" -> _]) & /@
listTemplates)
Select[listData, matchTemplatesQ]
Out:
{"400HGXX--", "960KG1D--"}
The mystical @@, /@ and ( # )& stuff is just a shorthand for Apply,
Map and Function, which you might want to look up in help.
Hope this helps
/Janus--
||
Janus Wesenberg _||_ www.ifa.au.dk/~jaw
Ph.D. Student at Quantop ( ) jaw@^^^^^^^^^
\ /
||