正则表达式甚至平价

时间:2016-04-13 17:04:52

标签: regex parity

我正在尝试制作一个与一个数字相匹配的正则表达式,它的总和是奇偶校验。因此802(8 + 0 + 2)是偶数,并且902(9 + 0 + 2)是奇数。显然,有一个算术法来执行此正则表达式,不计算或破坏任何正则表达式的规则。我为偶数制作了一个正则表达式,但不是偶数奇偶校验。

编辑:允许接受前导零,数字可以是任意长度(明显小于int在大多数语言中的最大大小)

谢谢!

1 个答案:

答案 0 :(得分:0)

这是一个非常棘手的问题(我是regex的新手),但我刚刚了解到你可以在一些正则表达式中使用递归。

这就是我提出的:

String regex = "(([02468]*[13579]){2}(?R))|[02468]*$";  

这个想法是使用一个聪明的简化,其中数字的奇偶校验只有在奇数位数是偶数时才是偶数,因为偶数个奇数位的总和总是偶数,并且任何数字的总和偶数位数始终是偶数。说明:

([02468]*[13579]){2} → 2 odd digits separated by any number of even digits
(?R)                 → Repeat the whole regex on the string after match
|                    → OR
[02468]*$            → the rest of String is 0 or more even digits

修改
递归只会使符号更简单,但如果没有递归它仍然是可能的(某些语言如Java没有实现递归),这个想法是一样的:

String regex = "(([02468]*[13579]){2})*[02468]*$"