0

我正在尝试制作一个正则表达式,它将与一个数字匹配,其总和是奇偶校验,是偶数。所以 802 (8+0+2) 是偶数,而 902 (9+0+2) 是奇数。显然,有一个算术定律可以在不计算或违反任何 Regex 规则的情况下执行此 Regex。我为偶数制作了一个正则表达式,但不是为偶数奇偶校验。

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

谢谢!

4

1 回答 1

0

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

这就是我想出的:

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

EDIT
Recursion 只是使符号更简单,但没有递归仍然是可能的(像Java这样的一些语言没有实现递归),想法是一样的:

String regex = "(([02468]*[13579]){2})*[02468]*$"
于 2016-04-13T17:32:02.407 回答