Perl idiom:if( $x =~ m/fee(fie)foe(fum)/ ) { print "Yup!"; }
if( /fee(fie)foe(fum)/ . test(x) ) {
alert("Yup!");
}
-- or, similar to the next idiom, --
if( x.match( /fee(fie)foe(fum)/ ) ) {
alert("Yup!");
}
Perl idiom:if( $x =~ m/fee(fie)foe(fum)/ ) { print "$1$2"; }
var m = x.match( /fee(fie)foe(fum)/ );
if(m) { alert(m[1] + m[2]); }
Perl idiom:$x =~ s/([a-j])/X/g;
x = x.replace( /([a-j])/g , "X" );
Perl idiom:$x =~ s/([a-j])/X$1/g;
x = x.replace( /([a-j])/g , "X$1" );
Perl idiom:$x =~ s/([a-j])/$funky{$1}/g;
x = x.replace( /([a-j])/g ,
function(x) { return funky[x]; }
);
Perl idiom:$x =~ s/([A-Z])([a-z])/thang($1,$2)/g;
x = x.replace( /([A-Z])([a-z])/g ,
function(c) { return thang( c[0], c[1] ); }
);
Perl idiom:@y = ($x =~ m/([a-j]+)/g);
y = x.match( /([a-j]+)/g ) || [];
Perl idiom:$x =~ tr/a-j/0-9/ -- or -- $y = $x =~ tr/a-j/0-9/;
// Use a regexp replacement, // as with the "funky" example above.
Perl idiom:while( $x =~ m/(f.)/g ) { print "Zonk! $1 at ", pos($x), "!\n"; }
var x = "fee fie foe fum";
var re = /(f.)/g;
while(1) {
var m = re.exec(x);
if(!m) break;
print("Zonk! " + m[1] + " at " +
re.lastIndex.toString() + "!\n");
}
Perl idiom:$y = quotemeta($x);
y = x.replace( /([^A-Za-z0-9])/g , "\\$1" );
Perl idiom:$x = qr/$y/;
x = new RegExp(y);
This leads us to an interesting problem: suppose I have a hash in x, whose keys are string-values to replace, and the value for each is the string value that should be put in instead; and I want to perform replacement based on that.
var i = "the poppy is popular with pop stars?";
var map = {
'popular': 'fashionable',
'pop': 'fun',
'poppy': 'flower',
"?" : "!"
};
alert(super_replace(i, map));
// shows: "the flower is fashionable with fun stars!"
function super_replace (s, map) {
var re_bits = [];
for(var k in map) { re_bits.push(k) }
if(!re_bits.length) return s;
re_bits.sort( _for_re );
for(var i = 0; i < re_bits.length; i++ ) {
re_bits[i] = quotemeta( re_bits[i] );
}
var re = new RegExp( "(" +
re_bits.join("|") + ")", 'g' );
return s.replace( re,
function (bit) { return map[bit] } );
}
function quotemeta (s) {
return s.replace( /([^a-zA-Z0-9])/g, "\\$1" );
}
function _for_re (a,b) { // longest-first
return(
(a.length > b.length) ? -1
: (a.length < b.length) ? 1
: (a < b) ? -1
: (a > b) ? 1
: 0
);
}
That super_replace function is handy -- notably, most uses of tr///
are just a special case of it.
Sean M. Burke, 02008-02-06