Regular Expression Help Needed

D

Deja User

I am new to regular expressions and I can't seem to figure out
following.

(1) Regular expression should find a match, if the given string does
NOT start with 90, 91, 31, or 32.

(2) Find a match, if the string contains DNI or 'DO NOT INSTALL'
anywhere in the string.

I need two seperate expressions for (1) and (2).

Thanks
 
G

Gunnar Hjalmarsson

Didn't you find any further newsgroups where you could post your
homework questions?

Deja said:
I am new to regular expressions and I can't seem to figure out
following.

(1) Regular expression should find a match, if the given string
does NOT start with 90, 91, 31, or 32.

(2) Find a match, if the string contains DNI or 'DO NOT INSTALL'
anywhere in the string.

I need two seperate expressions for (1) and (2).

What have you tried so far?
 
P

Paul Lalli

Date: 11 Feb 2004 08:13:13 -0800
From: Deja User <[email protected]>
Newsgroups: comp.lang.perl.misc, comp.lang.tcl, comp.unix.questions, alt.php,
comp.programming
Subject: Regular Expression Help Needed

I am new to regular expressions and I can't seem to figure out
following.

(1) Regular expression should find a match, if the given string does
NOT start with 90, 91, 31, or 32.

(2) Find a match, if the string contains DNI or 'DO NOT INSTALL'
anywhere in the string.

I need two seperate expressions for (1) and (2).

Thanks

Well, I have no idea what all those other groups will give you, but here
you'll get a perl answer. And btw, this sounds suspciously like a
homework question.... naughty naughty.

$string !~ /^(90|91|31|32)/

$string =~ /(DNI|DO NOT INSTALL)/

Paul Lalli
 
B

Bruce Hartweg

Deja said:
I am new to regular expressions and I can't seem to figure out
following.
this will help learn about REs

http://www.tcl.tk/man/tcl8.4/TclCmd/re_syntax.htm
(1) Regular expression should find a match, if the given string does
NOT start with 90, 91, 31, or 32.
a negative lookahead constraint is what you want:

http://www.tcl.tk/man/tcl8.4/TclCmd/re_syntax.htm#M26

regexp {^(?!(90|91|31|32))} $input
(2) Find a match, if the string contains DNI or 'DO NOT INSTALL'
anywhere in the string.
this is simple alternation

regexp {DNI|NO NOT INSTALL} $input

I need two seperate expressions for (1) and (2).

Thanks

Bruce
 
D

Deja User

Thanks for the help. Just to clear things up, this is NOT a homework
question.. I already graduated from collge in 94. I am just new to
regular expressions. I already did some research on the web and read
some tutorials.. but still having trouble.
 
D

Deja User

Here is my input and I am testing it in UltraEdit.. but your
suggestions don't seem to work. Am I doing anything wrong? I was
hoping that UltraEdit would highlight the matched lines.

INPUT
-----

32000806-001
91000883-xxx
64000343-394
20032043-001
31091003-003
90384334-092
10903103-033
20932002-934
This is my cat
cat is good
Test Point, DNI
TP, DO NOT INSTALL
DNI
34000000-343
 
P

Programmer Dude

Deja said:
I am new to regular expressions and I can't seem to figure out
following.

(1) Regular expression should find a match, if the given string
does NOT start with 90, 91, 31, or 32.

A pity about that "NOT". To find strings that match, you can just
do:
^((3[12])|(9[01])).*$

This is worth exploring if you're not too familiar with REs.

^((3[12])|(9[01])).*$ - the whole thing
^ - anchors RE to start of line
( ) - groups the two possible sub-patterns
( )|( ) - sub-pattern A *OR* sub-pattern B
3[12] - a "3" followed by a "1" or "2"
9[10] - a "9" followed by a "0" or "1"
.* - anything (i.e. rest of the line)
$ - anchors RE to end of line

NOTE: some systems require you to escape the grouping parentheses
and the "either/or" delimiter:

^\(\(3[12]\)\|\(9[01]\)\).*$

But the combination of the NOT and the double-digit prefixes makes
it a little harder. Something like this, perhaps:

^((9[^01])|(3[^12])|[^39]).*$

Broken out a bit:

^( (9[^01]) | (3[^12]) | [^39] ) .* $

This works by allowing lines that don't match.

^((9[^01])|(3[^12])|[^39]).*$ -
^( | | ).*$ - SOL, prefix, rest of line, EOL
(9[^01]) - "9" + NOT "0" or "1"
(3[^12]) - "3" + NOT "1" or "2"
[^39] - anything BUT NOT "3" or "9"
(2) Find a match, if the string contains DNI or 'DO NOT INSTALL'
anywhere in the string.

Easy:
(DNI)|(DO NOT INSTALL)
 
B

Bruce Hartweg

Deja said:
Here is my input and I am testing it in UltraEdit.. but your
suggestions don't seem to work. Am I doing anything wrong? I was
hoping that UltraEdit would highlight the matched lines.

INPUT
-----

32000806-001
91000883-xxx
64000343-394
20032043-001
31091003-003
90384334-092
10903103-033
20932002-934
This is my cat
cat is good
Test Point, DNI
TP, DO NOT INSTALL
DNI
34000000-343

There was a typo in the 2nd RE (had NO instead of DO) but other than that
the REs work (run the following:)

set RE1 {^(?!(90|91|31|32))}
set RE2 {DNI|DO NOT INSTALL}

set input {
32000806-001
91000883-xxx
64000343-394
20032043-001
31091003-003
90384334-092
10903103-033
20932002-934
This is my cat
cat is good
Test Point, DNI
TP, DO NOT INSTALL
DNI
34000000-343
}

foreach line [split $data \n] {
puts "Checking >> $line << :"
if {[regexp $RE1 $line]} {puts " Does NOT start with 90,91,31 or 32"}
if {[regexp $RE2 $line]} {puts " Contains DNI or DO NOT INSTALL"}
puts ""
}

Note that this is Tcl (since thats the newsgroup I read your question on)
and I don;t know Ultraedit, so the RE syntax could be slightly different
(as well as supoort for negative lookaheads) - so either the REs need
tweaked for Ultraedit, or there is something else in the settings beyaond
the RE for UltraEdit to highlight.

Bruce
 
B

Barry Margolin

Here is my input and I am testing it in UltraEdit.. but your
suggestions don't seem to work. Am I doing anything wrong? I was
hoping that UltraEdit would highlight the matched lines.

Different programs use different regular expression matchers, and they
often have different advanced features. I believe the suggestions were
intended for TCL, since you cross-posted to comp.lang.tcl.

Which language are you really planning to use? Post just to that group,
and you should get an answer most appropriate to your needs.
 
D

Deja User

Thanks for very detailed explanation... There is a 3rd party
application I am using that filters out unwanted lines. It uses GNU
regular expression engine.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top