Regex - replace example fails for more than 6 digits
Peter Summerland
p.summerland at gmail.com
Wed Dec 26 09:26:43 PST 2012
I tried the example from the std.regex documentation:
//Comify a number auto
com = regex(r"(?<=\d)(?=(\d\d\d)+\b)","g");
assert(replace("12000 + 42100 = 54100", com, ",") == "12,000 +
42,100 = 54,100");
It did not work for me when I entered numbers with more than 6
digits. Using \d{3} instead of \d\d\d worked in all cases. The
issue appears to be in the lookahead, not the lookbehind. Here
are some examples:
import std.regex, std.stdio;
int main(string[] args)
{
if( args.length != 2 ) {
writefln("usage: rdmd commas.d digits", args[0]);
return 1;
}
auto digits = args[1];
// \d{3} ok, with and without lookbehind
auto rx_bf_d3 = regex( r"(?<=\d)(?=(\d{3})+\b)", "g");
writefln( "rx_bf_d3 : %s", replace(digits, rx_bf_d3, ",") );
auto rx_f_d3 = regex( r"(\d)(?=(\d{3})+\b)", "g");
writefln( "rx_f_d3 : %s", replace(digits, rx_f_d3, "$1,") );
// \d\d\d fails, with and without lookbehind
auto rx_bf_ddd = regex( r"(?<=\d)(?=(\d\d\d)+\b)", "g");
writefln( "rx_bf_ddd: %s ", replace(digits, rx_bf_ddd, ",") );
auto rx_f_ddd = regex( r"(\d)(?=(\d\d\d)+\b)", "g");
writefln( "rx_f_ddd : %s", replace(digits, rx_f_ddd, "$1,") );
return 0;
}
/*
$> rdmd commas.d 1234567
rx_bf_d3 : 1,234,567
rx_f_d3 : 1,234,567
rx_bf_ddd: 1234,567
rx_f_ddd : 1234,567
*/
Am I missing something, or is this a bug?
Thanks,
Peter
More information about the Digitalmars-d-learn
mailing list