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