use strict; use warnings; die "No search terms supplied!" unless @ARGV; my %targets; my ($prePost) = $ARGV[0] =~ /^(\d+)$/; my @words = split /(?= )/, do {local $/ = undef; }; my @tags; shift if defined $prePost; $prePost = 5 unless defined $prePost; map {$targets{$_} = (0)} @ARGV; for (0..$#words) { $words[$_] =~ s/[\r\n]+/ /; my $curr = $words[$_]; my ($pre, $word, $post) = $curr =~ /([^\w]*)(\w*)(.*)/; if (exists $targets{$word}) { $words[$_] = "$pre<$word>$post"; push @tags, $_; } next if ! @tags or $tags[0] > $_ - $prePost; print "".(join '', @words[$tags[0] - $prePost .. $tags[-1] + $prePost])."\n"; @tags = (); } print join '', @words[$tags[0] - $prePost .. $#words] if @tags; #### __DATA__ Regular expressions have always been a weak spot for me, and I've got a question that's got me stumped. Here's the problem I'm trying to solve. I have somewhat large articles of text (returned from a search), what I'd like to do is capture the word and X number of words before and after it while tagging the matching word in the captured text. My inital thought was to try something like this. The problem I have is that if there is more than one term and they overlap, the nth term will not be annotated. So my next thought is lookahead/lookbehind, but they don't capture. Is there a way to do this with a single regex? Is a regex even the best way to do this? Thanks, -Lee #### a weak spot for me, I've got a question that's that's got me stumped. Here's problem I'm trying to solve. what I'd like to do capture word X number of words before X number of words before after it while tagging matching word in the captured tagging matching word in captured text. My inital thought this. The problem I have that if there more than one term and more than one term they overlap, nth term will not be annotated. So my next thought lookahead/lookbehind, but they don't capture. regex? Is a regex even best way to do this?