| Thread overview |
|---|
October 25, 2002 problems with ?/{0,1} in RegExp | ||||
|---|---|---|---|---|
| ||||
I'm having grief from the RegExp libs,
I'm tryng to match -- item [optional item] item
eg "(a)(b)?(c)" ()'s used so I can use replace( "$1" ); later
but this will match to "acc" but I can not use $2 or $3 in a replace statement.
also I want to do ..
"(a)((b|c)?(d|e)*)(f) and use 'a' and 'f' (which might be say '\S+\s*\{' and
'}\s*\S+')
ideally with the following replace symantics (see end of message for the
current o/p)
$1 -> (a)
$2 -> ((b|c)?(d|e)*)
$3 -> (f)
even if $2 == ""
and either another regexp has to be run over $2 or
$21 -> (b|c)?
$22 -> (d|e)*
I'm not 100% used to regexps I've always avoided them so am a bit unsure
what the regexp experts would be expecting; I would be happy if I could use
$1 -> (a)
$2 -> ((b|c)?(d|e)*)
$3 -> (b|c)?
$4 -> (d|e)*
$5 -> (f)
the code I've been trying is this
import regexp;
import string;
char[] convInner( RegExp form, char[] inp )
{
if ( form.test( inp ) != 0 )
{
char[] one = "1";
char[] two = "2";
char[] three = "3";
one = form.replace( "$1" );
// comment out theses lines to get this to not throw an exception
two = form.replace( "$2" );
three = form.replace( "$3" );
return "Transfromed '"~one~"' + '"~two~"' + '"~three~"';";
}
return "NO TRANSFORM "~inp;
}
void myConvert1( char[] inp )
{
char[] rv;
rv = convInner( new RegExp( '^(a)(b){0,1}(c*)', null ), inp );
printf( "conv1) %s -> %s\n", (char *)inp, (char *)rv );
}
void myConvert2( char[] inp )
{
char[] rv;
rv = convInner( new RegExp( '^(a)((b){0,1})(c*)', null ), inp );
printf( "conv2) %s -> %s\n", (char *)inp, (char *)rv );
}
void myConvert3( char[] inp )
{
char[] rv;
rv = convInner( new RegExp( '^(a)(b)?(c*)', null ), inp );
printf( "conv3) %s -> %s\n", (char *)inp, (char *)rv );
}
void myConvert4( char[] inp )
{
char[] rv;
rv = convInner( new RegExp( '^(a)((b)?)(c*)', null ), inp );
printf( "conv4) %s -> %s\n", (char *)inp, (char *)rv );
}
int main( char[][] args )
{
char[] str1 = "abcc";
char[] str2 = "acc";
myConvert1( str1 );
myConvert2( str1 );
myConvert3( str1 );
myConvert4( str1 );
myConvert1( str2 );
myConvert2( str2 );
myConvert3( str2 );
myConvert4( str2 );
return 0;
}
which outputs
conv1) abcc -> Transfromed 'a' + 'b' + 'cc';
conv2) abcc -> Transfromed 'a' + 'b' + 'b';
conv3) abcc -> Transfromed 'a' + 'b' + 'cc';
conv4) abcc -> Transfromed 'a' + 'b' + 'b';
Error: ArrayBoundsError regexp(2396)
| ||||
October 26, 2002 Re: problems with ?/{0,1} in RegExp | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Mike Wynn | I'll take a look. -Walter "Mike Wynn" <mike.wynn@l8night.co.uk> wrote in message news:apc16h$c6r$1@digitaldaemon.com... > I'm having grief from the RegExp libs, > I'm tryng to match -- item [optional item] item > eg "(a)(b)?(c)" ()'s used so I can use replace( "$1" ); later > > but this will match to "acc" but I can not use $2 or $3 in a replace statement. > > also I want to do .. > "(a)((b|c)?(d|e)*)(f) and use 'a' and 'f' (which might be say '\S+\s*\{' and > '}\s*\S+') > ideally with the following replace symantics (see end of message for the > current o/p) > $1 -> (a) > $2 -> ((b|c)?(d|e)*) > $3 -> (f) > even if $2 == "" > and either another regexp has to be run over $2 or > $21 -> (b|c)? > $22 -> (d|e)* > > I'm not 100% used to regexps I've always avoided them so am a bit unsure what the regexp experts would be expecting; I would be happy if I could use > $1 -> (a) > $2 -> ((b|c)?(d|e)*) > $3 -> (b|c)? > $4 -> (d|e)* > $5 -> (f) > > the code I've been trying is this > > import regexp; > import string; > > char[] convInner( RegExp form, char[] inp ) > { > if ( form.test( inp ) != 0 ) > { > char[] one = "1"; > char[] two = "2"; > char[] three = "3"; > one = form.replace( "$1" ); > // comment out theses lines to get this to not throw an exception > two = form.replace( "$2" ); > three = form.replace( "$3" ); > return "Transfromed '"~one~"' + '"~two~"' + '"~three~"';"; > } > return "NO TRANSFORM "~inp; > } > > void myConvert1( char[] inp ) > { > char[] rv; > rv = convInner( new RegExp( '^(a)(b){0,1}(c*)', null ), inp ); > printf( "conv1) %s -> %s\n", (char *)inp, (char *)rv ); > } > > void myConvert2( char[] inp ) > { > char[] rv; > rv = convInner( new RegExp( '^(a)((b){0,1})(c*)', null ), inp ); > printf( "conv2) %s -> %s\n", (char *)inp, (char *)rv ); > } > > void myConvert3( char[] inp ) > { > char[] rv; > rv = convInner( new RegExp( '^(a)(b)?(c*)', null ), inp ); > printf( "conv3) %s -> %s\n", (char *)inp, (char *)rv ); > } > > void myConvert4( char[] inp ) > { > char[] rv; > rv = convInner( new RegExp( '^(a)((b)?)(c*)', null ), inp ); > printf( "conv4) %s -> %s\n", (char *)inp, (char *)rv ); > } > > int main( char[][] args ) > { > char[] str1 = "abcc"; > char[] str2 = "acc"; > > myConvert1( str1 ); > myConvert2( str1 ); > myConvert3( str1 ); > myConvert4( str1 ); > > myConvert1( str2 ); > myConvert2( str2 ); > myConvert3( str2 ); > myConvert4( str2 ); > return 0; > } > > which outputs > conv1) abcc -> Transfromed 'a' + 'b' + 'cc'; > conv2) abcc -> Transfromed 'a' + 'b' + 'b'; > conv3) abcc -> Transfromed 'a' + 'b' + 'cc'; > conv4) abcc -> Transfromed 'a' + 'b' + 'b'; > Error: ArrayBoundsError regexp(2396) > > > | |||
October 26, 2002 Re: problems with ?/{0,1} in RegExp | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Walter | as an aside, I had a look around the Perl site for info on Regexp's (its one thing Perl's very good at) and found http://dev.perl.org/rfc/360.html regexps are slow (in comparison to arithmetic ops) so having Objects rather than char[] returned would not represent a major performance hit. ( semi c++ pseudo code to show ownership) i.e. RegExpElement [] Regexp::Eval( char[] str ); // runs the regexp over the string, can reuse the Regexp object char[] RegExpElement::toString(); // get the "value" of the () element RegExpElement RegExpElement::next(); // get the next if the group had a postfix of *,+,? or {} RegExpElement[] RegExpElement::chlidren(); // get the child groups from the regexp e.g RegExp rex = new RegExp( "(a)*(b+)(c+(d+)(e)*)f" ); then rex.Eval( "aabbbcdddef" ); would return [ "a" :next-> "a" :next-> null "bbb" "cdde" <children> [ "dd" "e" :next-> null; ] ] then rex.Eval( "bbcdf" ); would return [ MT :next-> null "bb" "cd" <children> [ "d" MT :next-> null; ] ] i'm not sure if MT should be "" or null or a special 'empty' Element. "Walter" <walter@digitalmars.com> wrote in message news:apcrb4$17d1$1@digitaldaemon.com... > I'll take a look. -Walter > > "Mike Wynn" <mike.wynn@l8night.co.uk> wrote in message news:apc16h$c6r$1@digitaldaemon.com... > > I'm having grief from the RegExp libs, > > I'm tryng to match -- item [optional item] item > > eg "(a)(b)?(c)" ()'s used so I can use replace( "$1" ); later > > > > but this will match to "acc" but I can not use $2 or $3 in a replace statement. > > > > also I want to do .. > > "(a)((b|c)?(d|e)*)(f) and use 'a' and 'f' (which might be say '\S+\s*\{' > and > > '}\s*\S+') > > ideally with the following replace symantics (see end of message for the > > current o/p) > > $1 -> (a) > > $2 -> ((b|c)?(d|e)*) > > $3 -> (f) > > even if $2 == "" > > and either another regexp has to be run over $2 or > > $21 -> (b|c)? > > $22 -> (d|e)* > > > > I'm not 100% used to regexps I've always avoided them so am a bit unsure what the regexp experts would be expecting; I would be happy if I could > use > > $1 -> (a) > > $2 -> ((b|c)?(d|e)*) > > $3 -> (b|c)? > > $4 -> (d|e)* > > $5 -> (f) > > > > the code I've been trying is this > > > > import regexp; > > import string; > > > > char[] convInner( RegExp form, char[] inp ) > > { > > if ( form.test( inp ) != 0 ) > > { > > char[] one = "1"; > > char[] two = "2"; > > char[] three = "3"; > > one = form.replace( "$1" ); > > // comment out theses lines to get this to not throw an exception > > two = form.replace( "$2" ); > > three = form.replace( "$3" ); > > return "Transfromed '"~one~"' + '"~two~"' + '"~three~"';"; > > } > > return "NO TRANSFORM "~inp; > > } > > > > void myConvert1( char[] inp ) > > { > > char[] rv; > > rv = convInner( new RegExp( '^(a)(b){0,1}(c*)', null ), inp ); > > printf( "conv1) %s -> %s\n", (char *)inp, (char *)rv ); > > } > > > > void myConvert2( char[] inp ) > > { > > char[] rv; > > rv = convInner( new RegExp( '^(a)((b){0,1})(c*)', null ), inp ); > > printf( "conv2) %s -> %s\n", (char *)inp, (char *)rv ); > > } > > > > void myConvert3( char[] inp ) > > { > > char[] rv; > > rv = convInner( new RegExp( '^(a)(b)?(c*)', null ), inp ); > > printf( "conv3) %s -> %s\n", (char *)inp, (char *)rv ); > > } > > > > void myConvert4( char[] inp ) > > { > > char[] rv; > > rv = convInner( new RegExp( '^(a)((b)?)(c*)', null ), inp ); > > printf( "conv4) %s -> %s\n", (char *)inp, (char *)rv ); > > } > > > > int main( char[][] args ) > > { > > char[] str1 = "abcc"; > > char[] str2 = "acc"; > > > > myConvert1( str1 ); > > myConvert2( str1 ); > > myConvert3( str1 ); > > myConvert4( str1 ); > > > > myConvert1( str2 ); > > myConvert2( str2 ); > > myConvert3( str2 ); > > myConvert4( str2 ); > > return 0; > > } > > > > which outputs > > conv1) abcc -> Transfromed 'a' + 'b' + 'cc'; > > conv2) abcc -> Transfromed 'a' + 'b' + 'b'; > > conv3) abcc -> Transfromed 'a' + 'b' + 'cc'; > > conv4) abcc -> Transfromed 'a' + 'b' + 'b'; > > Error: ArrayBoundsError regexp(2396) > > > > > > > > | |||
October 26, 2002 Re: problems with ?/{0,1} in RegExp | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Mike Wynn | "Mike Wynn" <mike.wynn@l8night.co.uk> wrote in message news:apdtc6$2no8$1@digitaldaemon.com... > as an aside, I had a look around the Perl site for info on Regexp's (its one > thing Perl's very good at) > and found http://dev.perl.org/rfc/360.html D regexp's are equivalent to the javascript functionality, but I agree that Perl has gone way beyond that! | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply