给定一个十进制数N
作为一串数字,如何M
仅使用正则表达式检查它是否可整除,而不转换为 int?
M=2, 4, 5, 10 是显而易见的。对于 M=3,这里有一些有趣的见解:Regex filter numbers divisible by 3
谁能提供 M=7、9、11、13 等的解决方案?通用的吗?
测试代码(在 python 中,但可以随意使用任何语言):
M = your number, e.g. 2
R = your regexp, e.g., '^[0-9]*[02468]$'
import re
for i in range(1, 2000):
m = re.match(R, str(i))
if i % M:
assert not m, '%d should not match' % i
else:
assert m, '%d must match' % i
对于那些好奇的人,这里有一个例子M=3
(假设引擎支持递归):
^
(
| [0369]+ (?1)
| [147] (?1) [258] (?1)
| [258] (?1) [147] (?1)
| ( [258] (?1) ) {3}
| ( [147] (?1) ) {3}
)
$
更新:有关更多讨论和示例,请参阅此线程。那里发布的表达式结果是错误的(在 70*N 上失败),但“如何到达那里”部分非常有教育意义。