• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 179
  • Last Modified:

One more simple perl + regular expression question

In continuation from http://www.experts-exchange.com/Programming/Programming_Languages/Perl/Q_22073185.html

using the solution given in above question, I get following
/cgi-bin/xmlsearch?strict=1&encoding=iso-8859-1&query=3A19341&type=adv&hits=50&offset=750&sortspec=-mtime

Now, I want to replace
hits=50 with hits=500
and
offset=750 with offset=0

How do I do that?

0
avi_india
Asked:
avi_india
1 Solution
 
avi_indiaAuthor Commented:
in the original string it could be

hits=50
hits=1
hits=567
hits=0
hits=2341


similarly for offset
0
 
xaniusCommented:
If you only want to replace the examplers above, try:

open( FILE, "< $filename" ) or die "Can't open $filename : $!";

while( <FILE> ) {
    ($query) =~ /GET (.*) HTTP/;
    $query =~ s/hits=50/hits=500/;
    $query =~ s/offset=50/hits=500/;
    print "$query\n";
}
close FILE;

If you want to replace any number, try:

open( FILE, "< $filename" ) or die "Can't open $filename : $!";

while( <FILE> ) {
    ($query) =~ /GET (.*) HTTP/;
    $query =~ s/hits=\d+/hits=500/;
    $query =~ s/offset=\d+/offset=0/;
    print "$query\n";
}
close FILE;


Cheers Xanius
0
 
avi_indiaAuthor Commented:
how can we make it more precise? I mean consider & also while defining this  expression?
0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
xaniusCommented:
if you want to replace all of but only the explicit figures above:

open( FILE, "< $filename" ) or die "Can't open $filename : $!";

while( <FILE> ) {
    ($query) =~ /GET (.*) HTTP/;
    $query =~ s/hits=(0|1|50|567|2341)\&/hits=500\&/;
    $query =~ s/offset=\d+/offset=0/;
    print "$query\n";
}
close FILE;
0
 
avi_indiaAuthor Commented:
Hey Xanius
Thanks.

Actually, what I meant by giving those examples was that it could be any number. But as its a url, u might have similar patter elsewhere also..


like sdf34r32rf*Q$TR#@RGFERhits=324234r!@&wqrefjki

I want to change the instances where hits=<some no> is enclosed between "&"

0
 
xaniusCommented:
Ok. so for any number between  "=" and "&", the following regex would work:

If you want to replace any number, try:

open( FILE, "< $filename" ) or die "Can't open $filename : $!";

while( <FILE> ) {
    ($query) =~ /GET (.*) HTTP/;
    $query =~ s/hits=\d+\&/hits=500\&/;
    $query =~ s/offset=\d+\&/offset=0\&/;
    print "$query\n";
}
close FILE;

or as in your last example (althogh i doubt a hit figure of '324234r!@&wqrefjki'):

open( FILE, "< $filename" ) or die "Can't open $filename : $!";

while( <FILE> ) {
    ($query) =~ /GET (.*) HTTP/;
    $query =~ s/hits=(.+?)\&/hits=500\&/;
    $query =~ s/offset=(.+?)\&/offset=0\&/;
    print "$query\n";
}
close FILE;
0
 
Adam314Commented:
You could put a & before the hits and offset...

$query =~ s/\&hits=\d+\&/\&hits=500\&/;
$query =~ s/\&offset=\d+\&/\&offset=0\&/;

0
 
xaniusCommented:
Hi avi_india,

> Actually, what I meant by giving those examples was that it could be any number. But as its a url, u might have similar patter elsewhere also..


>like sdf34r32rf*Q$TR#@RGFERhits=324234r!@&wqrefjki

I probably misunderstood your last question; Adam314 is right, but ten it should be necessary to have the \& only up front to allow


$query =~ s/\&hits=\d+/\&hits=500/;
$query =~ s/\&offset=\d+/\&offset=0/;


Xanius
0
 
mjcoyneCommented:
> Actually, what I meant by giving those examples was that it could be any number. But as its a url, u might have similar patter elsewhere also..
> like sdf34r32rf*Q$TR#@RGFERhits=324234r!@&wqrefjki
> I want to change the instances where hits=<some no> is enclosed between "&"

Do you mean that the above example string should be altered to sdf34r32rf*Q$TR#@RGFER&hits=324234&r!@&wqrefjki?

If so, try something like:

#!/usr/bin/perl -w
use strict;

my $str = 'sdf34r32rf*Q$TR#@RGFERhits=324234r!@&wqrefjki';

$str =~ s/(hits\s*=\s*\d+)/&$1&/;

print $str;

0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now