#!/usr/bin/perl -w use strict; sub randchrs { my ($type, $length) = @_; $length ||= '1'; my @w = ('A'..'Z', 'a'..'z', '0'..'9', '_'); my @d = ('0'..'9'); my @chrs; for ($type) { /w/ && do {@chrs = @w; last}; /d/ && do {@chrs = @d; last}; # other options here } if ( $length =~ /(\d+),(\d+)/ ) { $length = $1 + int(rand($2 - $1 + 1)); } my $answer = ''; for (1..$length) { $answer .= $chrs[int(rand(@chrs))]; } return $answer; } while ( my $regex = ) { chomp $regex; $regex =~ s/\(?\\([wd])\)?({([\d,]+)})?/randchrs($1,$3)/eg; print "$regex\n"; } __DATA__ STRING: (\w){3}(\d){5}(\w){3,5} PHONE: \d{3}-\d{3}-\d{4} SSN: \d{3}-\d{4}-\d{3} MORE: several word chars: \w{3,8} WA_DL: \w{7}\d{3}\w{2} STUFF: \w\d\w\d\w\d ANGRY: "\w{5,9}", he said, "\w{5,9}, \w{5,9}, and \w{5,9}."