Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式与可除性_Php_Regex - Fatal编程技术网

Php 正则表达式与可除性

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)" } 编辑:哦,

我如何创建一个正则表达式来测试一个数字是否可以被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)" }

编辑:哦,这是一个面试问题。是的,这里的正确答案是“这不是解决这个问题的正确工具!”

只有将数字翻译成一元数(
1
=
1
2
=
11
3
=
111
4
=
1111
等)才有可能

然后你可以检查你的数字是否匹配
^(1{divisior})*$
。如果你不能使用
{}
,你需要把它拼出来。所以要检查4的可除性,试着匹配
^(1111)*$
,等等


但是,头脑正常的人都不会这样做。如果你的面试官让你使用
ereg
,那么我猜他的正则表达式知识已经有几十年的历史了。

所以,很明显,你通常不会使用正则表达式来做这件事……但是人们会做一些疯狂的事情。有一个正则表达式可以确定一个数字是否正确主

作为一个解决方案的想法,如果允许你用另一种格式来表示数字

  • 将数字转换为数字大小等于1的字符串(4=“1111”)
  • regexp
    /^(1{$divisor})+$/
以Tcl为例

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->有限状态机。