[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: OT: RE madness



On Mon, Jan 06, 2003 at 11:40:08PM -0200, andrej hocevar wrote:
> I've been playing around with these two REs in Perl with no
> success. Can anyone tell me what's wrong?
> 
> This works:
> !~ /^(?:red|blue)$/

	$var !~ /<expression>/ ==> var as no match for expression

	/^<expression>$/ ==> match expression at ^beginning and
	ending$ of line

	/(<expression>)/ ==> match what's inside the (parens) as a
	whole unit

	/(?:<expression>)/ ==> match (paren) expression without
	remembering the match for a $1 or $2 or $3... replacement

	/<expr1>|<expr2>/ ==> match either expr1 or expr2

so

	$var !~ /^(?:red|blue)$/

	!~       is false when
	/        matching
	^        at the beginning of the line
	(|)      one of the alternatives
(	:?       without having to remember the sub-match )
	red|blue either "red" or "blue"
	$        at the end of the line (right before newline, if any)

to reverse it, change !~ (false when matching) to =~ (true when
matching).

> and will match everything except any of the two fixed strings
> "red" or "blue" or any combination thereof. "black" matches,
> as does "blu", because it's neither red nor blue.

slight rewording needed -- "black" comes back as true BECAUSE IT
DOESN'T MATCH, and that's what you're looking for with !~. it
might seem like a small distinction until you realize how easy
it is to be misled! :)

=~ match                $var =~ /expr/
!~ don't match      ! ( $var =~ /expr/ )

> Then I wanted to convert the above expression to a "positive"
> match, like this:
> =~ /^[^(?:red|blue)]$/
> 
> which fails. Why is this? Is there no way of saying "neither/nor",
> just "either/or"?

using brackets, /[something]/ will match any s, o, m, e, t, h,
i, n, or g.

all you needed to do was change !~ (doesn't match) to =~ (does
match) and you should be done.

	$goodsign = ( $politics !~ /republican|democrat/i );
	$american_phone =~ /\b(\d\d\d)\D*(\d\d\d)\D*(\d\d\d\d)\b/;

-- 
I use Debian/GNU Linux version 3.0;
Linux server 2.2.17 #1 Sun Jun 25 09:24:41 EST 2000 i586 unknown
 
DEBIAN NEWBIE TIP #56 from Vineet Kumar <debian-user@virtual.doorstop.net>
:
Troubled by DOS-FORMAT OR MAC-FORMAT TEXT FILES? Here's another
way to deal with those troublesome ^M characters: a simple
	tr -d '\015'  < dos.file  > reg.file
should do the trick.  While we're on the subject, a Mac file
can be converted with
	tr '\015' '\012'  < mac.file  > reg.file
You can do all your CR/LF translations with tr as long as you
can remember that macs use CRs, *nices use LFs, and DOS uses
CR+LF.

Also see http://newbieDoc.sourceForge.net/ ...



Reply to: