#!/usr/bin/perl use strict; use warnings; die "No search terms supplied!" unless @ARGV; my @words = @ARGV; my $regex = join("|",@words) ; my $expr = qr /^($regex)$/; $/ = ' '; my $i = 0; my $words = {}; my $pos = tell(DATA); for my $word () { chomp $word; $i++; if ($word =~ /$expr/) { for my $j (-5 .. 5) { $words->{$i + $j}++; } }; } seek(DATA, $pos, 0); $i =0; for my $word () { $i++; chomp $word; $word = "<$word>" if ($word =~ /$expr/); print "$word " if exists $words->{$i}; } __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