Here's one that matches numbers that are divisible by 10 (assumes 0 is divisible by 10).
\d*0
;)
I forgot to mention, watching the regex engine step through the matches can be quite educational, using the regex debugger:
(simplified the test by removing useless cases and just using (?:...)* )
perl -Mre=debug -wle'print "Divisible by 3\n" if ("x"x shift)=~/^(?:...)*$/;' 9
Contrast the "Non-prime"
perl -Mre=debug -wle 'print "Prime" if (1 x shift) !~ /^1?$|^(11+?)\1+$/' 9
with the "prime"
perl -Mre=debug -wle 'print "Prime" if (1 x shift) !~ /^1?$|^(11+?)\1+$/' 7
The prime case takes a LOT of operations to prove, relatively speaking (almost twice as many). So regex "computers" may not be the efficiency wave of the future :)
If a=[0369] and b=[147] and c=[258],
then (a|b(a|ba*c)*(c|ba*b)|c(a|ca*b)*(b|ca*c))*
is the regular expression for determining if a number is divisible by 3
I`m having problems with the programming syntax of RegExs, but basicly, I think you`re close; my solution was:
A = (0+3+6+9)*
B = (1+4+7)
C = (2+5+8)
r = ABABABA + ABACA + ACABA + ACACACA + ACACABABA + A
Or in other words:
r = A ( BA(BAB+C) + CA( B + CA(C+BAB) ) )* A
I can`t, for the life of me, write that in the syntax you used, so I guess that`s the end of my contribution to this thread.
Ariel
If a=[0369] and b=[147] and c=[258],
then (a|b(a|ba*c)*(c|bb)|c(a|ca*b)*(b|cc))+ is a number divisible by 3.
Sorry, I answer the question twice. Anyway, the first answer is correct except that it also excepts the empty string. The second answer is missing a couple of a's and should be (a|b(a|ba*c)*(c|ba*b)|c(a|ca*b)*(b|ca*c))+ to match the first answer, with the exception of the plus sign at the end.
Any Ariel's answer misses a number of the form BBCBB such as 11211, I believe.
"RegEx for divisibility by 7?" he asked daringly...
A test for seven exists, and is feasible, since you can design an automaton to do it`s job (so all you need to do is convert it to a regEx).