in reply to Anything else is fine!

Assuming I understand your spec, this can be accomplished using a combination of positive look aheads combined with Backreferences.

#!/usr/bin/perl use strict; use warnings; my @bad_strings = qw(ee); my @good_strings = qw(ef); foreach (@bad_strings) { print "$_ failed\n" if /(.)(?!\1|$)/; } foreach (@good_strings) { print "$_ failed\n" if not /(.)(?!\1|$)/; }

The regular expression works as follows:

  1. Any character is matched and captured into reference 1 ((.))
  2. A negative look ahead ((?!...)) then checks if the next character is either the matched character (\1) or (|) the end of the string ($). If either matches, the expression fails.

Update: Just noticed the bit about $&. The above code will store '.' in $& for your example. If you want to include both characters, you can append an additional '.' to the end of the regular expression, but note that this will consume two characters and hence removes the opportunity to also match '+.' for your sample. Rather than using $&, you may consider using $-[0] (see @ ) combined with substr. If you are only interested in the first match, you may want to wrap the entire expression in parentheses as per BrowserUK's suggestion below.