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).