in reply to Partial Searches Against Multiple Wildcards

They'd like to insert an entry like ... D7*D-48*6 ... the expectation being that searching for D7RD or DD482 would return [it]

If I understand correctly, you want a) that each character of the search term match either the same character or * in the corresponding entry; b) that an arbitrary number of characters can appear in the entry between any two characters of the search term.

This corresponds easily to a regular expression: replace each character x of the search term with a choice /x|\*/ (or character class [x*]), and insert a "match anything" pattern /.*/ between each pair:

sub make_regexp { my($search_term) = @_; my $str_re = join '.*', map "[$_*]", split //, $search_term; return qr{$str_re}; }

Since anything can match between search term characters, no special handling is needed for the hyphen. (But if you want to allow them to specify it and have it not match an asterisk, then it will need special handling in the map.)

In terms of precomputing possible matches, the fact that an arbitrary number of characters can appear between any two characters of the search term pretty much rules that out.

Hope this helps.

Replies are listed 'Best First'.
Re^2: Partial Searches Against Multiple Wildcards
by p_jacobson (Novice) on Dec 18, 2023 at 04:18 UTC

    Thank you. This is a great solution and why I needed some fresh eyes looking at this. As noted by LanX, there is no arbitrary number of characters where an asterisk appears. Joining with -? handles my use-case and passes all my tests. Thanks again for your answer.

Re^2: Partial Searches Against Multiple Wildcards
by LanX (Saint) on Dec 18, 2023 at 03:50 UTC
    > that an arbitrary number of characters can appear in the entry between any two characters of the search term.

    I don't see this. Only that one single hyphen can appear in between.

    But the character class approach is nice and should also be translatable to an SQL LIKE.

    Best solution so far! Just join with "-?" instead of ".*" to handle hyphens.

    👍🏼

    update

    I think I see your confusion, but DD482 can match the bracketed part of D7(*D-48*)6 it doesn't start with the first D.

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    see Wikisyntax for the Monastery