Php 正则表达式与可除性
我如何创建一个正则表达式来测试一个数字是否可以被I(2整除,除非这是一个家庭作业问题,否则在这种情况下没有理由使用正则表达式 使用“模数”操作符,它会将值的剩余部分除以Php 正则表达式与可除性,php,regex,Php,Regex,我如何创建一个正则表达式来测试一个数字是否可以被I(2整除,除非这是一个家庭作业问题,否则在这种情况下没有理由使用正则表达式 使用“模数”操作符,它会将值的剩余部分除以 if($number%$i) { "This runs if $number modulus is not 0 (not evenly divisible by $i)" } else { "This runs if $number modulus is 0 ( evenly Divisible by $i)" } 编辑:哦,
if($number%$i) { "This runs if $number modulus is not 0 (not evenly divisible by $i)" }
else { "This runs if $number modulus is 0 ( evenly Divisible by $i)" }
编辑:哦,这是一个面试问题。是的,这里的正确答案是“这不是解决这个问题的正确工具!”只有将数字翻译成一元数(
1
=1
,2
=11
,3
=111
,4
=1111
等)才有可能
然后你可以检查你的数字是否匹配^(1{divisior})*$
。如果你不能使用{}
,你需要把它拼出来。所以要检查4的可除性,试着匹配^(1111)*$
,等等
但是,头脑正常的人都不会这样做。如果你的面试官让你使用
ereg
,那么我猜他的正则表达式知识已经有几十年的历史了。所以,很明显,你通常不会使用正则表达式来做这件事……但是人们会做一些疯狂的事情。有一个正则表达式可以确定一个数字是否正确主
作为一个解决方案的想法,如果允许你用另一种格式来表示数字
- 将数字转换为数字大小等于1的字符串(4=“1111”)
- regexp
/^(1{$divisor})+$/
proc testit {value} {
set value1 [string repeat 1 $value]
for {set i 2} {$i <= 10} {incr i} {
set matches [regexp "^(1{$i})+$" $value1]
puts "${i}: $matches"
}
}
proc testit{value}{
设置值1[字符串重复1$value]
对于{set i2}{$i@Charles在他的评论中的答案是不正确的。下面是你如何构建一个正则表达式以将可除数除以3:。你可以为7做类似的事情。为什么要使用正则表达式?为什么不直接除数?正则表达式不是正确的工具。我讨厌这样的采访。正则表达式不应该像这样使用。我可以在散热器上煮鸡蛋,但做的是o我的散热器用得不好。你不想为一个认为正则表达式是做这项工作的合适工具的人工作。@业余程序员:反正我也不想要这样的工作。问如何用错误的工具解决某个问题是没有意义的。你应该回答:这个问题不应该用正则表达式解决。我也许他们想要的答案是“我永远不会用正则表达式来做这件事。”我想我首先需要一个reqexp来将4_10转换为1111_2。一个通用的转换器可能很难做到。@业余程序员:使用正则表达式绝对不可能做到这一点。但是使用以10为基数的正则表达式来检查除数也是不可能的。@Tim,对于某些特定的整数是可能的,比如2,5,10。但这可能不是面试官所期望的。@Mic哈:是的,4和8也是如此(尽管后者会成为一个可怕的正则表达式)。但是3、6、7和9是不可能的。@Tim Pietzcker:事实上,任何基数的任何数字都是可能的。3很简单:匹配只包含0、1和2的3的倍数的正则表达式是/^(0 | 10*2 | 10*1 | 20*1)+$/
您可以将其转换为正则表达式以匹配3的任意倍数,方法是将0替换为[0369]
,将1替换为[147]
,将2替换为[258]
。7的表达式既长又复杂(以10为基数,因为7不除以(10-1)*10的幂),但它确实存在。没有任何正则表达式可以确定字符串是否是素数的十进制表示形式。制作一个与素数的一元表示形式匹配的字符串并不难(而且制作一个与组合的一元表示形式匹配的字符串也很容易)。这是完全正确的答案。谢谢你,阿洛克。@Alok有下面正确的解决方案。Regex->有限状态机。