You might want to split the string using Text::Balanced's extract_multiple function and then apply a map to extract your data (this code extracts the first '+' and replaces it with a '-'):
use strict;
use warnings;
use List::Util qw/first/;
use Text::Balanced qw/extract_multiple extract_bracketed/;
my $text = "1*(2+3)*(3+4)+5*(6+7)+42";
my @results = extract_multiple(
$text,
[
{
Bracketed => sub { extract_bracketed( $_[0], '()' ) }
},
{ PlusOperator => qr{[+]} },
{ MultiplyOperator => qr{[*]} },
{ Number => qr{\d+(?:\.\d+)?} },
]
);
my $operator = first { ref($_) eq 'PlusOperator' } @results;
# $operator holds '+'
my $plus;
my $new_string = join(
'',
map {
if ( !$plus && ref $_ eq 'PlusOperator' ) {
$plus = 1;
'-'
} else {
$$_
}
} @results
);
print "$new_string\n";
or the answer is 'no', regexes that parse data like that are never going to be elegant.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|