http://www.perlmonks.org?node_id=194196


in reply to Regular Expression Builder

Just a thought: replace all letters by "A" and all digits by "9". Then apply the Regex::PreSuf thing — or just quotemeta(). And in that result, replace "A" with '\w' and "9" with '\d'.

Intermediate steps, as an example: @foo23  ->  @AAA99  ->  \@AAA99  ->  \@\w\w\w\d\d

Replies are listed 'Best First'.
Re: Re: Regular Expression Builder
by belg4mit (Prior) on Aug 31, 2002 at 01:39 UTC
    Clever, but add the step (actually, merge it with the A9 -> metachar translation):
    s%((?:\\w)+)%'\w{'. length($1)/2 .'}'%eg; ...

    --
    perl -pew "s/\b;([mnst])/'$1/g"

Re: Re: Regular Expression Builder
by BigLug (Chaplain) on Sep 03, 2002 at 04:37 UTC
    I was going to suggest the same thing. This is similar to how the old dBase use to work with its 'patterns' to authenticate data. I can't remember it completely but I'd suggest using extra wildcards to the above:
    • A or a: Any alpha character
    • Z: Uppercase character
    • z: Lowercase character
    • 9: Numeral
    • *: Any string of characters
    • ?: Any single character
    Anything apart from the above would be a literal .. as would escaping the above with a backslash.
    ALSO: Note that /\w/ ne /a-z/i

    These combined would result in:

    USER: @foo29 RE: /\@foo2\d/ USER: @zzz99 RE: /\@[a-z]{3}\d{2}/ USER: @AAA99 RE: /\@[a-zA-Z]\d{2}/ #Note that 'A' becomes #[a-zA-Z] rather than [a-z] with /i #because there may later be a 'z' #in your users pattern :)
    The code for parsing this shouldn't be too hard to create, but I'd suggest wrapping the following comment in at an earlier stage and parsing the users pattern looking for repeats as you go.