Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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
Regex 用3s计数正则表达式_Regex_String Matching_Digit - Fatal编程技术网

Regex 用3s计数正则表达式

Regex 用3s计数正则表达式,regex,string-matching,digit,Regex,String Matching,Digit,我在自学正则表达式,并发现了一个测验网站,该网站一直在帮助我为正则表达式寻找更多的应用程序,并帮助我扩展对正则表达式工作原理的了解 我发现了一个问题,要求我建立一个正则表达式来匹配10位数字,这些数字是3的倍数。我能想到的唯一方法是让正则表达式识别数字的值,并能够对它们进行数学运算。这怎么可能 换句话说,正则表达式将匹配什么 0003 0006 0351 1749 但不匹配 0005 0011 0361 4372 正如@Jerry say在评论中所说,您可以使用以下内容: ([0369]|[

我在自学正则表达式,并发现了一个测验网站,该网站一直在帮助我为正则表达式寻找更多的应用程序,并帮助我扩展对正则表达式工作原理的了解

我发现了一个问题,要求我建立一个正则表达式来匹配10位数字,这些数字是3的倍数。我能想到的唯一方法是让正则表达式识别数字的值,并能够对它们进行数学运算。这怎么可能

换句话说,正则表达式将匹配什么

0003
0006
0351
1749
但不匹配

0005
0011
0361
4372

正如@Jerry say在评论中所说,您可以使用以下内容:

([0369]|[147][0369]*[258]|([258]|[147][0369]*[147])([0369]|[258][0369]*[147])*([147]|[258][0369]*[258]))+

更简短的是

首先,你需要从一个数字可以被三整除的规则开始,当且仅当它的数字之和可以被三整除(证明这一点需要一点数论,但它有助于看到9、99、999等都是三的倍数,因此1、10、100、1000等都会在被三除时对数字的剩余部分贡献相同的量)

然后,请注意有三种数字:

  • 三的倍数:0、3、6和9。它们相当于0(mod 3)
  • 1比3的倍数多1倍:1、4和7。它们相当于1(mod 3)
  • 两个大于三的倍数:2、5和8。它们相当于-1(mod 3)。按照惯例,该类命名为2,但-1对我们更有用。因为1+2=0(mod 3),-1是2的合法名称
然后,数字0、3、6和9是三的倍数。如果我们从class0的任意位置添加任意数量的数字,该数字仍然是三的倍数(因此33、999和963都是三的倍数)。如果我们从类1的任何位置添加一个数字,我们需要添加类-1的另一个数字,或者添加类1的另外两个数字,以将剩余部分恢复为0。同样,如果我们从类-1的任何位置添加一个数字,我们需要添加类1的另一个数字,或者add类-1的两个以上数字,将剩余部分恢复为0

以下是wcp的答案,格式为perl
/x
正则表达式,便于阅读:

/
(   [0369] # 0
  | [147] [0369]* [258] # 1 + 0 + -1 = 0
  | (   [258] # -1
      | [147] [0369]* [147] # 1 + 0 + 1 = -1
    ) # -1
    (   [0369] # 0
      | [258] [0369]* [147] # -1 + 0 + 1 = 0
    )* # 0
    (   [147] # 1
      | [258] [0369]* [258] # -1 + 0 + -1 = 1
    ) # 1 ... -1 + 0 + 1 = 0
)+
/x

正则表达式匹配余数为0的数字组。第一个分支只匹配类0的数字;第二个分支匹配余数为1然后返回0的组;第三个分支匹配余数为-1然后返回0的组。它的构造有些巧妙ted(我认为,一个不那么高傲的regex会有五个主要分支,而不是三个),但是注释应该足够让你跟随它。

是regex.alf.nu吗?这个谜题有一个正则表达式,它不完全依赖于数字的多重性,我相信它是最短的正则表达式。否则,你可以检查。这实际上是regex.alf.nu。我试着用霍布斯的解释来解决这个问题,结果是这是一个比wcp更强大的东西,但仍然是错误的link帮助我注意到我忽略了复杂的mod 0案例。花了我一段时间,但我找到了它。谢谢大家!太好了!如果你对三的倍数使用通用正则表达式,它应该可以工作。也许你忘了使用锚
^$
来确保检查整个字符串?非常感谢你。我没有考虑过用mod reside来形成字符串我发现了几篇关于基础数学的文章,它们可以在正则表达式中使用,我把注意力集中在这个方向上。