Hi *,
i stumbled on what seems to be a bug in std.regexp: It is incredibly
slow using the following pattern:
RegExp("^\\s+(\\d+)\\s+(\\d+)\\s+\\w+\\s+(\\w+)\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+(.*)\r?\n?$")
I don't really get the regexp code, so i can't debug it myself, but i
have a PHP (!!) script that executes the same regexp in milliseconds.
I attached code to test it, can someone please confirm?
Thanks,
Markus
PS: Is there a quick way to fix this or are there bindings for other
RegExp libs that i can use (Linux and Windows required) - i need to fix
my program soon :) atm i'm looking for workarounds (splitting it into
small regexps).
import std.stdio;
import std.regexp;
char[][] lines = [
" 0 0 ACCEPT icmp -- * * 0.0.0.0/0
0.0.0.0/0 ",
" 0 0 ACCEPT tcp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 21 ",
" 0 0 ACCEPT udp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 21 ",
" 36 2540 ACCEPT tcp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 22 ",
" 0 0 ACCEPT udp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 22 ",
" 0 0 ACCEPT tcp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 80 ",
" 0 0 ACCEPT udp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 80 ",
" 10 492 ACCEPT tcp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 655 ",
" 16 5000 ACCEPT udp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 655 ",
" 0 0 ACCEPT tcp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 990 ",
" 0 0 ACCEPT udp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 990 ",
" 0 0 ACCEPT tcp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 902,8333 ",
" 0 0 ACCEPT udp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 902,8333 ",
" 0 0 ACCEPT tcp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 8767,14534,51234 ",
" 0 0 ACCEPT udp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 8767,14534,51234 ",
" 0 0 ACCEPT tcp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 28960,20800,20810 ",
" 25 1072 ACCEPT udp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 28960,20800,20810 ",
" 0 0 ACCEPT tcp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 49000:49999 ",
" 0 0 ACCEPT udp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 49000:49999 ",
" 0 0 ACCEPT tcp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 16567,29900,29901 ",
" 31 1798 ACCEPT udp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 16567,29900,29901 ",
" 0 0 ACCEPT tcp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 53 ",
" 0 0 ACCEPT udp -- * * 0.0.0.0/0
0.0.0.0/0 multiport dports 53 ",
" 92 10111 ACCEPT tcp -- * * 0.0.0.0/0
0.0.0.0/0 ",
" 2 100 ACCEPT udp -- * * 0.0.0.0/0
0.0.0.0/0 ",
" 0 0 ACCEPT all -- * * 0.0.0.0/0
0.0.0.0/0 ",
];
void main() {
RegExp ruleLine =
RegExp("^\\s+(\\d+)\\s+(\\d+)\\s+\\w+\\s+(\\w+)\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+(.*)\r?\n?$");
for (int i=0; i<lines.length; i++) {
char[] l = lines[i];
char[][] m = ruleLine.match(l);
writefln("%sMATCHED: %s", (m.length==0)?"UN":"", l);
}
}