470,581 Members | 2,460 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 470,581 developers. It's quick & easy.

Simple Regular Expression.

EFP
Can anyone help me with a simple regular expression problem.

All that I want to do is take a list of known data and extract a
particular section of the string to form a new list.

Here is my code snipet:

my $fh = new FileHandle('c:\Units.txt') ; ## sucks up my work file
my @lines1 = <$fh>; ## assigns the filehandler contents to @lines1
foreach $string (@lines1) ## extract each line from @lines and put it
in $string
{

$string =~ m/\*@@\$/;

print "NewString :: $string\n";
}

Sample Units.txt data:
..\Source\CPP\ConnPool\src\oraUtils.pc@@
..\Source\CPP\ConnPool\src\sample.pc@@
..\Source\CPP\Services\src\OExceptServer.pc@@
..\Source\CPP\Services\src\Rees1440Server.pc@@
..\Source\CPP\Services\src\SWDTestServer.pc@@
..\Source\CPP\TestCases\TestRees1800\testRees1800C ursor.pc@@
..\Source\CPP\TSRI\Remis1\cxxsrc\Buffer_Area.pc@@

I just want the:
oraUtils.pc

I'd even settle for:
oraUtils.pc@@

So basically I want the contents between "\" and the "@@"

I thought that:
$string =~ m/\*@@\$/;

Would go to the end of the search line and find "@@" and get anything
"*" between the "@@" and the "\" and set $string to this new value.

What it returns is:
element:: .\Source\CPP\ConnPool\src\oraUtils.pc@@

Can anyone correct my understanding of regular expression and
assignment to a varibale.

Thanks.
EFP
Jul 19 '05 #1
3 1998
EFP wrote:
Sample Units.txt data:
.\Source\CPP\ConnPool\src\oraUtils.pc@@
<snip>
I just want the:
oraUtils.pc
<snip>
So basically I want the contents between "\" and the "@@"

I thought that:
$string =~ m/\*@@\$/;

Would go to the end of the search line and find "@@" and get
anything "*" between the "@@" and the "\" and set $string to this
new value.
What on earth made you think that??
Can anyone correct my understanding of regular expression and
assignment to a varibale.


Yes, you can do that. By studying the Perl documentation for regular
expressions:

http://www.perldoc.com/perl5.8.0/pod/perlre.html

This would do what you want:

($string) = $string =~ /.*\\(.+)\@\@/;

But please use the docs to get an understanding of how it works.

--
Gunnar Hjalmarsson
Email: http://www.gunnar.cc/cgi-bin/contact.pl

Jul 19 '05 #2
EFP
Based upon your expression I'm still not sure how it works. You have
the first ".*" which says 0 or more periods. Then you escape the slash
to look for a "\" then the "(.+)" match 1 or more periods and then you
escape both @@'s individually. So I still don't understand how the
".*" and the "(.+)" are used. Also, how does this say give me the
contents between the \ and the @@. I have read the reference pages
before and after this post. Could you shed some light on the
reasoning? I'm sure once you explain it regular expression will be
easier to comprehend.

..\Source\CPP\ConnPool\src\oraUtils.pc@@ (source)

Thanks


Gunnar Hjalmarsson <no*****@gunnar.cc> wrote in message news:<3S********************@newsc.telia.net>...
EFP wrote:
Sample Units.txt data:
.\Source\CPP\ConnPool\src\oraUtils.pc@@


<snip>
I just want the:
oraUtils.pc


<snip>
So basically I want the contents between "\" and the "@@"

I thought that:
$string =~ m/\*@@\$/;

Would go to the end of the search line and find "@@" and get
anything "*" between the "@@" and the "\" and set $string to this
new value.


What on earth made you think that??
Can anyone correct my understanding of regular expression and
assignment to a varibale.


Yes, you can do that. By studying the Perl documentation for regular
expressions:

http://www.perldoc.com/perl5.8.0/pod/perlre.html

This would do what you want:

($string) = $string =~ /.*\\(.+)\@\@/;

But please use the docs to get an understanding of how it works.

Jul 19 '05 #3
EFP wrote:
Gunnar Hjalmarsson wrote:
EFP wrote:

Sample Units.txt data:
.\Source\CPP\ConnPool\src\oraUtils.pc@@

I just want the:
oraUtils.pc
($string) = $string =~ /.*\\(.+)\@\@/;


Based upon your expression I'm still not sure how it works. You
have the first ".*" which says 0 or more periods.


No it doesn't. '.' is a regex metacharacter that matches any character
(except newline) if it's not escaped, so it says 0 or more of _any_
characters.
Then you escape the slash to look for a "\"
Correct. Since the '.*' is "greedy", the '\\' matches the _last_
backslash. (Read about "greediness" in perldoc perlre.)
then the "(.+)" match 1 or more periods
Again, it matches 1 or more of _any_ characters. The parentheses
capture the content, and the regex returns it when it's evaluated in
list context. The parentheses surrounding $string enforces list
context. (Read about "context" in perldoc perldata.)
and then you escape both @@'s individually.


Yep.

--
Gunnar Hjalmarsson
Email: http://www.gunnar.cc/cgi-bin/contact.pl

Jul 19 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

4 posts views Thread by peterbe | last post: by
4 posts views Thread by Neri | last post: by
11 posts views Thread by Dimitris Georgakopuolos | last post: by
18 posts views Thread by Q. John Chen | last post: by
7 posts views Thread by Billa | last post: by
25 posts views Thread by Mike | last post: by
4 posts views Thread by drasko | last post: by
1 post views Thread by NvrBst | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.